From af4e5fa747188482963021810155641866be6208 Mon Sep 17 00:00:00 2001 From: Edward Choi Date: Wed, 16 Jun 2021 20:55:03 -0700 Subject: [PATCH] Merge dev to master (#117) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Refactor release.ts and update electron-packager * Change yarn build and yarn start * Add dist to .gitignore * Remove dist * Fixed run mode sagas connection, cleaned up other bits * Changed ./main/MenuTemplate * Changed ./main/networking * Changed main-process.js and RendererBridge.js * Changed ./renderer/actions * Changed ./renderer/components/periperals and App.js and ConfigBox.js * Changed ./renderer/components * Changed ./renderer/reducers * Changed ./renderer/utils * Added packet header functions, add comments and modifications * Update tsconfig.json, change ts to tsx, and add @types/react * Implemented typescript parser for ESLint * Add more build options in tsconfig.json * Remove dist from .gitignore * Revert DNav.tsx changes * Remove extra spaces in DNav.tsx * Progress towards fake runtime fix * Remove ansible-protos folder - already on dev branch * Fixed null quit bug and params proto bug, brought back console logs * Fixing restart fc null bug * Refactor .eslintrc.json * Fixed fake runtime to now be functional * Caching protobuf root * More updates to .eslintrc.json * Add .prettierrc.js * Updates in dependencies and tsconfig.json * Add object params for FieldActions updateTimer * Add temporary rules for linting and lint fixing actions and types in renderer folder * Move types from actions to parent directory (renderer) * Add example for new action/reducer pattern - alerts and console * Add lint support for reducers * Remove types that were originally derived from actions folder * Remove .prettierrc.js - already in package.json * Modified EditorActions and FieldActions + Fixed any types in FieldActions * Update utf-8-validate and socket.io-client dependencies * Fixing package json * Fixed Capitalization and GamepadsAction * Finished InfoActions * Finished PeripheralAction * Finished SettingsAction * Lint actions * Rename some parameters for some action dispatch functions * Remove export defaults in reducers * Upgrade redux to version 4.0.5 * Minor fixes in reducers * Lint reducers * Rename dawnApp to rootReducer * Refactor constants folder * Lint consts * Lint types * Edit in webpack.config.babel.ts * Add 1st round of .eslintrc.json config * More updates to .eslintrc.json * Updates in tsconfig.json, package.json, yarn.lock, and .eslintrc.json * Add prettier to package.json * Update eslint and .eslintrc.json edit * Lowercase files for fieldStore and timerStore * Adding starter typing for ansible * Added proto Typescript defs. Changed Ansible to Runtime and added most types. Changed gamepad and peripherals * Fixed the build-protos yarn script * Add types in ConfigBox.tsx * Small edit to componentDidMount in ConfigBox component * Fix electron-json-storage types * Edited Dashboard.tsx * Edited DNav.tsx * Type return type of info reducer * Add blueMasterTeamNumber and goldMasterTeamNumber to field store state * Edited EditorContainer.ts * Edited TooltipButton.tsx * Fixed minor import errors * Edited Gamepad.tsx * Adding typescript types and fixes for compilation * Fixing sensor data typing * Changed ConsoleOutput.tsx * Divided the props interface for reuse in GamepadList.tsx * Edited StatusLabel.tsx * Fixed any type for state generic type * Edited UpdateBox.tsx * Change the type of gamepads to GamepadObject array * - Updated gamepad and peripherals with Protobuf definition - Updated sagas and removed ansible disconnect - Updated lodash to new version * Getting battery params with indexes now. Commented version peripheral * Added types to menus. Installed more types packages. Made webpack file js * Edited App.tsx * Fixing version peripheral again. * Fixed socket typing in FieldControl * Changed the types of the props and made some parameters optional * Deleted redundant props * Worked on editors.tsx. Didn't fix all the type mismatches yet * Fix imports in FakeRuntime and delete line in App.tsx * Adding types to params in FakeRuntime * Fixing typing issues UDP recv of runtime ts * Upgrade redux saga * Fix types in sagas.ts * Add underscore prefix to unused parameters in main-process and Runtime * Fixed gamepad buttons in sagas * Add types in ConfigBox.tsx * Small edit to componentDidMount in ConfigBox component * Fix electron-json-storage types * Edited Dashboard.tsx * Edited DNav.tsx * Type return type of info reducer * Add blueMasterTeamNumber and goldMasterTeamNumber to field store state * Edited EditorContainer.ts * Edited TooltipButton.tsx * Fixed minor import errors * Edited Gamepad.tsx * Changed ConsoleOutput.tsx * Divided the props interface for reuse in GamepadList.tsx * Edited StatusLabel.tsx * Fixed any type for state generic type * Edited UpdateBox.tsx * Change the type of gamepads to GamepadObject array * Edited App.tsx * Changed the types of the props and made some parameters optional * Deleted redundant props * Worked on editors.tsx. Didn't fix all the type mismatches yet * Changed the type of gamepadobject to GPstate * Changed the class name and fixed some props * Changed types of props * Changed the types of some function parameters to react events * Fixed merge conflicts * Add FieldControlConfig interfaces * Fixed typing for onFCUpdate * Add FieldControlConfig to export * Add types for numeral module * Refactor Gamepad.tsx * Allow gamepads to be undefined * Add outerDiv property to ConsoleOutput class component * Fixed typing errors: * Edited the param names and added proto interface to types * Edited Peripheral.tsx * Started working on PeripheralList.tsx * Added Joyride * Changed import and optional typings * Started working on Editor.tsx * Changed prop names and typings * Rename types.d.ts for ApplicationState to app-state.d.ts * Update some dependencies * Fix webpack loading * Fix types in FakeRuntime, protos, index.tsx * Add module resolution for smalltalk dependency * Fix react joyride typing * Add peripheral list type * Fixed type issues (changing OwnProps and mapStatetoProps) * Fix storage.get for editorFontSize and editorTheme * Changed React FormEvent * Fixed bootstrap issue: * Fix PeripheralList type and refactor PeripheralList.tsx * Fixed dialog.showmessagebox * Fixed import issue * Fixed typing and bootstrap issue * Remove I* proto types from renderer and FakeRuntime * Lint and refactor protos.d.ts * package.json and lint App.tsx * Remove brace imports and use ace-builds * Fix onEditorPaste function argument type * Added types for AceEditor * Fixed typing for onEditorPaste * Fix Dawn runtime errors * Merge Conflict changes * Fix smalltalk import error * Fix electron build * Add brace back as dependency * Fix electron-json-storage typing * Fix storage.get FieldControlConfig * Fix yarn build command * Updated Runtime.ts wsocket architecture, fixed gamepad state * Refactor networking module and tweak Runtime object variables/methods * Refactor TCPConn and related methods * Refactor UDPConn * Change RendererBridge methods to arrow functions * Added error handler for TCP socket * Fix default export * Update ssh2 * Fix runtime disconnect bug * Fix TCP connection * Added check for only connecting after first IP update. Added socket.pending back * Fix uid bug * Changed Runtime update location. UI has bugs * Fixed UpdateBox choosing .zip package * Working run modes and code upload * Updates in UpdateBox.tsx * Removed unnecessary code and imports * Ignore pending socket error * Use patch package to fix pending socket type error * Remove unnecessary changes in Runtime.ts * Fix peripheral display bug and fake runtime (#46) * Create and use Peripheral type and add peripheral logging * Working peripheral list, still UI issues * Change Peripheral component prop id to uid * Change exec style for FakeRuntime.ts * Fix fake runtime * Tweaks * Add comment about Peripheral type Co-authored-by: Ashwin Vangipuram * Fixed run mode starting and stopping (#58) * Added IDLE mode in dropdown * Removed ESTOP button and enums * Added isRunning and fixed play buttons * Fix some spacing Co-authored-by: ewc340 * Fixed crash when loading a file from filesystem (#57) * Fixed crash when loading a file from filesystem * Fixing other readFile calls for downloadCode and dragFile * Fix eslint config (#54) * Fix eslint config * Tweak * Fixed Runtime TCP connection and moved run_mode to reducer callback (#67) * DNav - converted to functional component (#50) * DNav - converted to functional component * Remove unused createMaster function and linting Co-authored-by: ewc340 * Converted ConfigBox Class to Functional Component (#49) * Converted classes to hooks * Lint and small changes Co-authored-by: ewc340 * Install rimraf and mkdirp * Fix release script and packaged app errors (#51) * Fix release script * Fix release script * Some tweaks * Shift some dependencies to be dev * Update electron-packager and add back better-npm-run build * fix gamepad bitmask * fix package scripts & gamepad bitmask * Fix ipAddress local storage issue * Remove string casting for peripheral uid and key * Revert backslashes on start and build commands * Add rimraf and mkdirp * Fix script commands with rimraf and mkdirp * Fix peripheral uid and peripheral type display bug * Fix peripheral param val display issues * Fix device type 0 display error * Add ParamComponent memoized * Add comments and small code styling fixes * Disable animation on modals due to performance reasons on long list of peripherals * Change FakeRuntime device send frequency to 20Hz * Lint Dashboard * Small refactor in peripherals reducer * Remove unneeded type assertion for connect in PeripheralList component * Add comment about param argument for getParamValue function in Peripheral.tsx * Remove input.proto * Change FakeRuntime send interval variable name * Fix some styling in Gamepad.tsx * Tweak comment Co-authored-by: Lance Jackson * Convert Gamepad proto to Input proto to match Runtime update (#70) * WIP: Replaced gamepad.proto with input.proto. pbts isn't autogenerating properly * Fixed input interfaces by moving enum. See protobufjs #1222 * Properly fixed proto generation using jsdoc patch * Refactored GpState into Input proto * Fixed bugs with displaying robot state. Fixed IP handling for ngrok. Fixed log decode bug * Merging and squashing branch origin/dev into input_proto * Moved dawn package to inside repo * Fixed ngrok IP splitting and IP changing * Addressed PR comments * Tweaks Co-authored-by: ewc340 * Added argument passing and fixed zipping for release.ts (#72) * Added argument passing and fixed zipping for release.ts * Add eslint disable to release.ts Co-authored-by: ewc340 * Add udp tunneling connection for Sp21 Comp (#73) * Add TCPTunneledConn * Change TCPTunneledConn to [200~UDPTunneledConn~ * Add Inputs msg type and tweaks * Add udpTunnelingIpAddress to redux state * Add UDP Tunneling field in ConfigBox * Add udpTunnelIpAddress change listener and add propert TCP packet splitting * Perform some cleanup and add ipcMain.on ip address change listener to BaseTCPConn * Add custom numbering to MsgType enum * Tweak comment to span 2 lines * Tweak comment * Tweak some logic for on data handler for reg TCP conn * Removed BaseTCPConn and added SSH address to ConfigBox and Redux * Linting * Add try/catch for udpForwarder send to UDP connection * Add comment * Remove comment * Fix message length Co-authored-by: Ashwin Vangipuram * Implement keyboard handler (#74) * Added map for the buttons and the file for keyboard * store key being pressed with hooks * uncommented handleButtonChange to get rid of angry red lines * Delete Keyboard and add toggleKeyboardControl beta version * Add the keyboard button dictionary * Add imports * togglekeyboard * minor warnings fixed * addEventListener debug * Added Redux * send characters on interval * keyboard input refreshes after interval * change keyboard input from interval to event based, send single character on press * Working on the sagas * Set it as array * Fixed the sendInput * updated keyboard input bool for keyup/down * added bitmap to redux * Fix merge conflict * Fixed the editorSavedState * Fixed the button alignment issue * Delete unused line * moved bitmap logix to editor.tsx * Removed Bool and KeyboardChar from the redux * remove bitmap logic from sagas * remove characterBool from state * remove characterBool from state * Remove unused vars * StatusLabel unused * change bitmap from number to bigint * Changing color of the button * updated arrow key names in mapping * update proto to include big int * Added KeyboardToggle to Redux * Ok idk what I am doing but here we go * reset to bigint have to convert to long * Spliced the bits * Fixed the bitmap error * Oh oops * Fixed intermittent input msgs, but keyboard doesn't disconnect * Fixed counting of keyboard keys * made changes that Edward said to * fixed bitmap on/off * Linting and various small fixes * Fix Redux isKeyboardModeToggled * Fix isKeyboardModeToggled name change in sagas * Small tweak Co-authored-by: Hailey Jang Co-authored-by: Thomas Lee Co-authored-by: Hailey Jang Co-authored-by: Ashish Pandian Co-authored-by: uthmanmomen13 Co-authored-by: Ashwin Vangipuram * Fix keyboard connected (#79) * updated keyboard connect/disconnect * removed unnecessary bitmap change in editor.tsx * Change buttons back to 0 * Tweaks Co-authored-by: ewc340 * Bump y18n from 3.2.1 to 3.2.2 Bumps [y18n](https://github.com/yargs/y18n) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] * Implement latency check for communication with Runtime (#85) * need to display latency on ui * worked on displaying latency on ui * added some prints * it was runtimes fault >:( * Add Latency status label * Add the delay and color changes * Modify the latency seconds * Accidentally deleted something * Probably 5 seconds is better * Style fixes * More minor style fixes and remove unused import * Add TODO Co-authored-by: uthmanmomen13 Co-authored-by: Hailey Jang * Fixed the negative latency issue (#89) * Change latency calculations to be one-way as per Runtime's request (#91) * Change latency calculations to be one-way * Remove rounding * Remove extra spaces * Add units for latency display (#92) * Add units for latency display * Variable renaming * Refactor RendererBridge (#94) * Fix merge conflicts * Some styling fixes * Added staff code button (#95) * button works need to test * change button text * Small tweaks Co-authored-by: ewc340 * updated staff code from akshit (#98) * Add new robot staff code (#99) * Bump lodash from 4.17.20 to 4.17.21 (#106) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump hosted-git-info from 2.8.8 to 2.8.9 (#107) Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ua-parser-js from 0.7.22 to 0.7.28 (#104) Bumps [ua-parser-js](https://github.com/faisalman/ua-parser-js) from 0.7.22 to 0.7.28. - [Release notes](https://github.com/faisalman/ua-parser-js/releases) - [Commits](https://github.com/faisalman/ua-parser-js/compare/0.7.22...0.7.28) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump codecov from 3.6.5 to 3.7.1 (#19) Bumps [codecov](https://github.com/codecov/codecov-node) from 3.6.5 to 3.7.1. - [Release notes](https://github.com/codecov/codecov-node/releases) - [Commits](https://github.com/codecov/codecov-node/compare/v3.6.5...v3.7.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ini from 1.3.5 to 1.3.8 (#62) Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8. - [Release notes](https://github.com/isaacs/ini/releases) - [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump postcss from 7.0.34 to 7.0.36 (#113) Bumps [postcss](https://github.com/postcss/postcss) from 7.0.34 to 7.0.36. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/7.0.34...7.0.36) --- updated-dependencies: - dependency-name: postcss dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Changed the version number to 3.0.0 Co-authored-by: Lawrence Chen Co-authored-by: Hailey Jang Co-authored-by: HaileyJang <55821834+HaileyJang@users.noreply.github.com> Co-authored-by: Ashwin Vangipuram Co-authored-by: Ashwin Vangipuram Co-authored-by: Meshan Khosla Co-authored-by: andrewecd <46904210+andrewecd@users.noreply.github.com> Co-authored-by: lancejackson Co-authored-by: Lance Jackson Co-authored-by: Thomas Lee Co-authored-by: Hailey Jang Co-authored-by: Ashish Pandian Co-authored-by: uthmanmomen13 Co-authored-by: Uthman Momen <34070661+uthmanmomen13@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Meshan Khosla --- .eslintrc.json | 73 +- .gitignore | 7 +- fake-runtime/FakeRuntime.js | 123 - fake-runtime/FakeRuntime.ts | 94 + .../MenuTemplate/{DawnMenu.js => DawnMenu.ts} | 4 +- .../{DebugMenu.js => DebugMenu.ts} | 25 +- .../MenuTemplate/{EditMenu.js => EditMenu.ts} | 4 +- .../MenuTemplate/{FileMenu.js => FileMenu.ts} | 3 +- .../MenuTemplate/{HelpMenu.js => HelpMenu.ts} | 5 +- .../MenuTemplate/{Template.js => Template.ts} | 0 main/RendererBridge.js | 25 - main/RendererBridge.ts | 82 + main/{main-process.js => main-process.ts} | 41 +- main/networking/Ansible.js | 285 -- .../{FieldControl.js => FieldControl.ts} | 47 +- main/networking/Runtime.ts | 517 +++ main/networking/index.ts | 2 + package.json | 107 +- patches/@types+node+14.0.14.patch | 12 + patches/jsdoc+3.6.6.patch | 13 + protos/device.proto | 29 + protos/input.proto | 26 + protos/protos.d.ts | 894 ++++ protos/protos.js | 2210 ++++++++++ protos/run_mode.proto | 19 + protos/start_pos.proto | 14 + protos/text.proto | 12 + protos/timestamp.proto | 12 + release.js | 48 - release.ts | 40 + renderer/actions/AlertActions.js | 18 - renderer/actions/AlertActions.ts | 20 + renderer/actions/ConsoleActions.js | 16 - renderer/actions/ConsoleActions.ts | 18 + renderer/actions/EditorActions.js | 50 - renderer/actions/EditorActions.ts | 70 + renderer/actions/FieldActions.js | 42 - renderer/actions/FieldActions.ts | 47 + renderer/actions/GamepadsActions.js | 5 - renderer/actions/GamepadsActions.ts | 9 + renderer/actions/InfoActions.js | 30 - renderer/actions/InfoActions.ts | 38 + renderer/actions/PeripheralActions.js | 10 - renderer/actions/PeripheralActions.ts | 13 + renderer/actions/SettingsActions.js | 9 - renderer/actions/SettingsActions.ts | 12 + renderer/components/App.js | 180 - renderer/components/App.tsx | 200 + renderer/components/ConfigBox.js | 220 - renderer/components/ConfigBox.tsx | 250 ++ .../{ConsoleOutput.js => ConsoleOutput.tsx} | 50 +- renderer/components/DNav.js | 163 - renderer/components/DNav.tsx | 178 + renderer/components/Dashboard.js | 34 - renderer/components/Dashboard.tsx | 27 + renderer/components/{Editor.js => Editor.tsx} | 406 +- renderer/components/EditorContainer.js | 86 - renderer/components/EditorContainer.ts | 93 + renderer/components/Gamepad.js | 136 - renderer/components/Gamepad.tsx | 113 + .../{GamepadList.js => GamepadList.tsx} | 27 +- renderer/components/JoyrideSteps.js | 73 - renderer/components/JoyrideSteps.tsx | 84 + .../{Peripheral.js => Peripheral.tsx} | 42 +- renderer/components/PeripheralList.js | 114 - renderer/components/PeripheralList.tsx | 115 + .../{StatusLabel.js => StatusLabel.tsx} | 54 +- .../{TooltipButton.js => TooltipButton.tsx} | 24 +- .../{UpdateBox.js => UpdateBox.tsx} | 104 +- .../components/peripherals/BooleanSensor.js | 47 - .../components/peripherals/BooleanSensor.tsx | 41 + .../{GameValues.js => GameValues.tsx} | 25 +- .../peripherals/GenericPeripheral.js | 39 - .../peripherals/GenericPeripheral.tsx | 61 + renderer/components/peripherals/Motor.js | 38 - renderer/components/peripherals/Motor.tsx | 30 + renderer/constants/Constants.js | 50 - renderer/consts/actions.ts | 64 + renderer/consts/index.ts | 14 + renderer/consts/keyboard-buttons.ts | 49 + renderer/consts/peripheral-types.ts | 23 + renderer/consts/robotStaffCode.tsx | 99 + renderer/consts/version.ts | 1 + renderer/{index.js => index.tsx} | 6 +- renderer/reducers/FieldStore.js | 57 - renderer/reducers/alerts.js | 23 - renderer/reducers/alerts.ts | 34 + renderer/reducers/console.ts | 50 + renderer/reducers/dawnApp.js | 29 - renderer/reducers/editor.js | 36 - renderer/reducers/editor.ts | 94 + renderer/reducers/fieldStore.ts | 92 + renderer/reducers/gamepads.js | 13 - renderer/reducers/gamepads.ts | 19 + renderer/reducers/info.js | 83 - renderer/reducers/info.ts | 123 + renderer/reducers/peripherals.js | 63 - renderer/reducers/peripherals.ts | 69 + renderer/reducers/rootReducer.ts | 27 + renderer/reducers/settings.js | 23 - renderer/reducers/settings.ts | 31 + renderer/reducers/studentConsole.js | 44 - .../reducers/{TimerStore.js => timerStore.ts} | 19 +- renderer/{store.js => store.ts} | 12 +- renderer/types/actions/alert-actions.ts | 19 + renderer/types/actions/console-actions.ts | 28 + renderer/types/actions/editor-actions.ts | 97 + renderer/types/actions/field-actions.ts | 58 + renderer/types/actions/gamepads-actions.ts | 11 + renderer/types/actions/index.ts | 44 + renderer/types/actions/info-actions.ts | 62 + renderer/types/actions/peripheral-actions.ts | 19 + renderer/types/actions/settings-actions.ts | 17 + renderer/types/app-state.d.ts | 1 + renderer/types/field-control-config.ts | 4 + renderer/types/index.ts | 3 + renderer/types/modules.d.ts | 1 + renderer/types/peripheral-list.ts | 20 + renderer/utils/{sagas.js => sagas.ts} | 288 +- renderer/utils/test/sagas.test.js | 12 +- renderer/utils/{utils.js => utils.ts} | 48 +- tsconfig.json | 33 + webpack.config.babel.js | 30 +- yarn.lock | 3828 ++++++++++++----- 124 files changed, 10288 insertions(+), 3816 deletions(-) delete mode 100644 fake-runtime/FakeRuntime.js create mode 100644 fake-runtime/FakeRuntime.ts rename main/MenuTemplate/{DawnMenu.js => DawnMenu.ts} (80%) rename main/MenuTemplate/{DebugMenu.js => DebugMenu.ts} (61%) rename main/MenuTemplate/{EditMenu.js => EditMenu.ts} (78%) rename main/MenuTemplate/{FileMenu.js => FileMenu.ts} (89%) rename main/MenuTemplate/{HelpMenu.js => HelpMenu.ts} (71%) rename main/MenuTemplate/{Template.js => Template.ts} (100%) delete mode 100644 main/RendererBridge.js create mode 100644 main/RendererBridge.ts rename main/{main-process.js => main-process.ts} (68%) delete mode 100644 main/networking/Ansible.js rename main/networking/{FieldControl.js => FieldControl.ts} (64%) create mode 100644 main/networking/Runtime.ts create mode 100644 main/networking/index.ts create mode 100644 patches/@types+node+14.0.14.patch create mode 100644 patches/jsdoc+3.6.6.patch create mode 100644 protos/device.proto create mode 100644 protos/input.proto create mode 100644 protos/protos.d.ts create mode 100644 protos/protos.js create mode 100644 protos/run_mode.proto create mode 100644 protos/start_pos.proto create mode 100644 protos/text.proto create mode 100644 protos/timestamp.proto delete mode 100644 release.js create mode 100644 release.ts delete mode 100644 renderer/actions/AlertActions.js create mode 100644 renderer/actions/AlertActions.ts delete mode 100644 renderer/actions/ConsoleActions.js create mode 100644 renderer/actions/ConsoleActions.ts delete mode 100644 renderer/actions/EditorActions.js create mode 100644 renderer/actions/EditorActions.ts delete mode 100644 renderer/actions/FieldActions.js create mode 100644 renderer/actions/FieldActions.ts delete mode 100644 renderer/actions/GamepadsActions.js create mode 100644 renderer/actions/GamepadsActions.ts delete mode 100644 renderer/actions/InfoActions.js create mode 100644 renderer/actions/InfoActions.ts delete mode 100644 renderer/actions/PeripheralActions.js create mode 100644 renderer/actions/PeripheralActions.ts delete mode 100644 renderer/actions/SettingsActions.js create mode 100644 renderer/actions/SettingsActions.ts delete mode 100644 renderer/components/App.js create mode 100644 renderer/components/App.tsx delete mode 100644 renderer/components/ConfigBox.js create mode 100644 renderer/components/ConfigBox.tsx rename renderer/components/{ConsoleOutput.js => ConsoleOutput.tsx} (60%) delete mode 100644 renderer/components/DNav.js create mode 100644 renderer/components/DNav.tsx delete mode 100644 renderer/components/Dashboard.js create mode 100644 renderer/components/Dashboard.tsx rename renderer/components/{Editor.js => Editor.tsx} (68%) delete mode 100644 renderer/components/EditorContainer.js create mode 100644 renderer/components/EditorContainer.ts delete mode 100644 renderer/components/Gamepad.js create mode 100644 renderer/components/Gamepad.tsx rename renderer/components/{GamepadList.js => GamepadList.tsx} (58%) delete mode 100644 renderer/components/JoyrideSteps.js create mode 100644 renderer/components/JoyrideSteps.tsx rename renderer/components/{Peripheral.js => Peripheral.tsx} (57%) delete mode 100644 renderer/components/PeripheralList.js create mode 100644 renderer/components/PeripheralList.tsx rename renderer/components/{StatusLabel.js => StatusLabel.tsx} (54%) rename renderer/components/{TooltipButton.js => TooltipButton.tsx} (61%) rename renderer/components/{UpdateBox.js => UpdateBox.tsx} (54%) delete mode 100644 renderer/components/peripherals/BooleanSensor.js create mode 100644 renderer/components/peripherals/BooleanSensor.tsx rename renderer/components/peripherals/{GameValues.js => GameValues.tsx} (50%) delete mode 100644 renderer/components/peripherals/GenericPeripheral.js create mode 100644 renderer/components/peripherals/GenericPeripheral.tsx delete mode 100644 renderer/components/peripherals/Motor.js create mode 100644 renderer/components/peripherals/Motor.tsx delete mode 100644 renderer/constants/Constants.js create mode 100644 renderer/consts/actions.ts create mode 100644 renderer/consts/index.ts create mode 100644 renderer/consts/keyboard-buttons.ts create mode 100644 renderer/consts/peripheral-types.ts create mode 100644 renderer/consts/robotStaffCode.tsx create mode 100644 renderer/consts/version.ts rename renderer/{index.js => index.tsx} (61%) delete mode 100644 renderer/reducers/FieldStore.js delete mode 100644 renderer/reducers/alerts.js create mode 100644 renderer/reducers/alerts.ts create mode 100644 renderer/reducers/console.ts delete mode 100644 renderer/reducers/dawnApp.js delete mode 100644 renderer/reducers/editor.js create mode 100644 renderer/reducers/editor.ts create mode 100644 renderer/reducers/fieldStore.ts delete mode 100644 renderer/reducers/gamepads.js create mode 100644 renderer/reducers/gamepads.ts delete mode 100644 renderer/reducers/info.js create mode 100644 renderer/reducers/info.ts delete mode 100644 renderer/reducers/peripherals.js create mode 100644 renderer/reducers/peripherals.ts create mode 100644 renderer/reducers/rootReducer.ts delete mode 100644 renderer/reducers/settings.js create mode 100644 renderer/reducers/settings.ts delete mode 100644 renderer/reducers/studentConsole.js rename renderer/reducers/{TimerStore.js => timerStore.ts} (65%) rename renderer/{store.js => store.ts} (58%) create mode 100644 renderer/types/actions/alert-actions.ts create mode 100644 renderer/types/actions/console-actions.ts create mode 100644 renderer/types/actions/editor-actions.ts create mode 100644 renderer/types/actions/field-actions.ts create mode 100644 renderer/types/actions/gamepads-actions.ts create mode 100644 renderer/types/actions/index.ts create mode 100644 renderer/types/actions/info-actions.ts create mode 100644 renderer/types/actions/peripheral-actions.ts create mode 100644 renderer/types/actions/settings-actions.ts create mode 100644 renderer/types/app-state.d.ts create mode 100644 renderer/types/field-control-config.ts create mode 100644 renderer/types/index.ts create mode 100644 renderer/types/modules.d.ts create mode 100644 renderer/types/peripheral-list.ts rename renderer/utils/{sagas.js => sagas.ts} (63%) rename renderer/utils/{utils.js => utils.ts} (71%) create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json index 3913b0c3..ea3c577c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,30 +1,65 @@ { "root": true, - "extends": "airbnb", - "globals": { - "VERSION": true, - "io": true - }, - "env": { - "browser": true, - "mocha": true - }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/recommended-requiring-type-checking", + "plugin:import/errors", + "plugin:import/warnings", + "prettier/@typescript-eslint", // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier + "plugin:react/recommended", + "prettier/react", + "prettier/standard", + "plugin:prettier/recommended" // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array. + ], + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint", + "jsdoc", + "import", + "prettier", + "react-hooks" + ], "parserOptions": { + "project": ["tsconfig.json"], "ecmaFeatures": { - "experimentalObjectRestSpread": true - } + "experimentalObjectRestSpread": true, + "jsx": true // Allows for the parsing of JSX + }, + "sourceType": "module", // Allows for the use of imports + "ecmaVersion": 2020 // Allows for the parsing of modern ECMAScript features }, "rules": { - "react/forbid-prop-types": "off", - "react/jsx-filename-extension": "off", - "react/no-string-refs": "off", - "react/require-default-props": "off", - "no-console": "off", + "react-hooks/rules-of-hooks": "error", // Checks rules of Hooks + "react-hooks/exhaustive-deps": "warn", // Checks effect dependencies, + + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-misused-promises": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-unnecessary-type-assertion": "off", + "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], + "@typescript-eslint/require-await": "off", + + // "comma-dangle": ["error", "never"], + "object-curly-spacing": ["error", "always"], + "default-case": "off", + "import/extensions": "off", "no-constant-condition": ["error", { "checkLoops": false }], "no-param-reassign": "off", "no-restricted-syntax": "off", - "no-underscore-dangle": "off", - "default-case": "off", - "react/jsx-closing-tag-location": "off" + "prettier/prettier": "error" + }, + "settings": { + "import/resolver": { + "node": { + "extensions": [".js", ".ts", ".tsx"] + } + }, + "react": { + "version": "detect" + } } } diff --git a/.gitignore b/.gitignore index af42ef7f..00232510 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,11 @@ node_modules .project .settings .idea/* - -build +.vscode/ *.log *~ + +# Dawn build +build/ +dawn-packaged/ diff --git a/fake-runtime/FakeRuntime.js b/fake-runtime/FakeRuntime.js deleted file mode 100644 index bd09e9f0..00000000 --- a/fake-runtime/FakeRuntime.js +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Fake Runtime is not handled by webpack like most of the other JS code but instead - * will be run "as is" as a child-process of the rest of the application. - * See DebugMenu.js for handling FakeRuntime within Dawn - */ - -/* eslint-disable camelcase */ - -const dgram = require('dgram'); -const net = require('net'); -const protobuf = require('protobufjs'); - -const DawnData = (new protobuf.Root()).loadSync('../ansible-protos/ansible.proto', { keepCase: true }).lookupType('DawnData'); -const RuntimeData = (new protobuf.Root()).loadSync('../ansible-protos/runtime.proto', { keepCase: true }).lookupType('RuntimeData'); -const Notification = (new protobuf.Root()).loadSync('../ansible-protos/notification.proto', { keepCase: true }).lookupType('Notification'); - -const TCPPORT = 1234; -const SENDPORT = 1235; -const LISTENPORT = 1236; -const MSGINTERVAL = 1000; // in ms - -const randomFloat = (min, max) => (((max - min) * Math.random()) + min); -const sensor = (device_type, device_name, param_value, uid) => ({ - device_type, - device_name, - param_value, - uid, -}); -const param = (param, type, value) => ({ // eslint-disable-line no-shadow - param, - float_value: type === 'float' ? value : undefined, - int_value: type === 'int' ? value : undefined, - bool_value: type === 'bool' ? value : undefined, -}); -const print = (output) => { - console.log(`Fake Runtime: ${output}`); -}; - - -class FakeRuntime { - constructor() { - this.sendSocket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); - this.listenSocket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); - - this.fakeState = RuntimeData.State.STUDENT_STOPPED; - this.listenSocket.on('message', (msg) => { - const data = DawnData.decode(msg); - switch (data.student_code_status) { - case DawnData.StudentCodeStatus.TELEOP: - print('Tele-Op'); - this.fakeState = RuntimeData.State.TELEOP; - break; - case DawnData.StudentCodeStatus.ESTOP: - print('E-Stop'); - this.fakeState = RuntimeData.State.ESTOP; - break; - case DawnData.StudentCodeStatus.AUTONOMOUS: - print('Autonomous'); - this.fakeState = RuntimeData.State.AUTO; - break; - default: - print('Idle'); - this.fakeState = RuntimeData.State.STUDENT_STOPPED; - } - }); - this.listenSocket.bind(LISTENPORT); - - this.tcpSocket = new net.Socket(); - this.tcpSocket.connect({ host: 'localhost', port: TCPPORT }, () => { - print('TCP Up'); - }); - this.tcpSocket.on('close', () => { - print('TCP Down'); - }); - - setInterval(this.onInterval.bind(this), MSGINTERVAL); - this.generateFakeData = this.generateFakeData.bind(this); - } - - generateFakeData() { - return { - robot_state: this.fakeState, - sensor_data: [ - sensor('MOTOR_SCALAR', 'MS1', [param('Val', 'float', randomFloat(-100, 100))], '100'), - sensor('MOTOR_SCALAR', 'MS2', [param('Val', 'float', randomFloat(-100, 100))], '101'), - sensor('LimitSwitch', 'LS1', [param('Val', 'int', Math.round(randomFloat(0, 1)))], '102'), - sensor('SENSOR_SCALAR', 'SS1', [param('Val', 'float', randomFloat(-100, 100))], '103'), - sensor('SENSOR_SCALAR', 'SS2', [ - param('Val 1', 'float', randomFloat(-100, 100)), - param('Val 2', 'float', randomFloat(-100, 100)), - param('Val 3', 'float', randomFloat(-100, 100))], '104'), - sensor('SENSOR_BOOLEAN', 'SB1', [param('Val', 'bool', Math.random() < 0.5)], '105'), - - // Special Cases handled in dawn/renderer/reducers/peripherals.js - sensor('Version', 'Ignored', [ - param('major', 'int', 1), - param('minor', 'int', 2), - param('patch', 'int', 3), - ], '-1'), - sensor('BatteryBuzzer', 'Ignored', [ - param('is_unsafe', 'bool', Math.random() < 0.5), - param('v_batt', 'float', randomFloat(0, 15)), - ], '0'), - ], - }; - } - - onInterval() { - const fakeData = this.generateFakeData(); - const udpData = RuntimeData.create(fakeData); - this.sendSocket.send(RuntimeData.encode(udpData).finish(), SENDPORT, 'localhost'); - if (this.fakeState !== RuntimeData.State.ESTOP - && this.fakeState !== RuntimeData.State.STUDENT_STOPPED) { - const tcpData = Notification.create({ - header: Notification.Type.CONSOLE_LOGGING, - console_output: `${randomFloat(-100, 100)}\n`, - }); - this.tcpSocket.write(Notification.encode(tcpData).finish()); - } - } -} - -new FakeRuntime(); // eslint-disable-line no-new diff --git a/fake-runtime/FakeRuntime.ts b/fake-runtime/FakeRuntime.ts new file mode 100644 index 00000000..aa583723 --- /dev/null +++ b/fake-runtime/FakeRuntime.ts @@ -0,0 +1,94 @@ +/* + * Fake Runtime is not handled by webpack like most of the other JS code but instead + * will be run "as is" as a child-process of the rest of the application. + * See DebugMenu.js for handling FakeRuntime within Dawn + */ + +/* eslint-disable camelcase */ +import { DevData, IParam, IDevice, IDevData } from '../protos/protos'; +import { createSocket, Socket as UDPSocket } from 'dgram'; +import { createServer, Server as TCPServer } from 'net'; + +const TCP_PORT = 8101; +const UDP_SEND_PORT = 9001; +const UDP_LISTEN_PORT = 9000; +const MSG_INTERVAL_MSEC = 50; + +const randomFloat = (min: number, max: number) => (max - min) * Math.random() + min; +const sensor = (name: string, type: number, params: IParam[], uid: number): IDevice => ({ + name, + type, + params, + uid, +}); + +const param = (name: string, type: string, value: any): IParam => ({ + // eslint-disable-line no-shadow + name, + fval: type === 'float' ? value : undefined, + ival: type === 'int' ? value : undefined, + bval: type === 'bool' ? value : undefined, +}); + +const print = (output: string) => { + console.log(`Fake Runtime: ${output}`); +}; + +class FakeRuntime { + sendSocket: UDPSocket; + listenSocket: UDPSocket; + tcpServer: TCPServer; + + constructor() { + this.sendSocket = createSocket({ type: 'udp4', reuseAddr: true }); + this.listenSocket = createSocket({ type: 'udp4', reuseAddr: true }); + + this.listenSocket.on('message', (_msg: any) => { + // TODO: Handle UDP gamepad recv + }); + this.listenSocket.bind(UDP_LISTEN_PORT); + + this.tcpServer = createServer((_c: any) => { + print('client connected'); + }); + this.tcpServer.listen(TCP_PORT, () => { + print('server bound'); + }) + + setInterval(this.onInterval, MSG_INTERVAL_MSEC); + } + + generateFakeData = () => { + return { + devices: [ + sensor('MOTOR_SCALAR', 0, [param('Val', 'float', randomFloat(-100, 100))], 100), + sensor('MOTOR_SCALAR', 0, [param('Val', 'float', randomFloat(-100, 100))], 101), + sensor('LimitSwitch', 3, [param('Val', 'int', Math.round(randomFloat(0, 1)))], 102), + sensor('SENSOR_SCALAR', 2, [param('Val', 'float', randomFloat(-100, 100))], 103), + sensor( + 'SENSOR_SCALAR', + 2, + [ + param('Val 1', 'float', randomFloat(-100, 100)), + param('Val 2', 'float', randomFloat(-100, 100)), + param('Val 3', 'float', randomFloat(-100, 100)), + ], + 104 + ), + sensor('SENSOR_BOOLEAN', 1, [param('Val', 'bool', Math.random() < 0.5)], 105), + + // Special Cases handled in dawn/renderer/reducers/peripherals.js + // sensor('Ignored', 5, [param('major', 'int', 1), param('minor', 'int', 2), param('patch', 'int', 3)], -1), + // sensor('Ignored', 5, [param('is_unsafe', 'bool', Math.random() < 0.5), param('v_batt', 'float', randomFloat(0, 15))], 0), + ], + }; + } + + onInterval = () => { + const fakeData: IDevData = this.generateFakeData(); + this.sendSocket.send(DevData.encode(fakeData).finish(), UDP_SEND_PORT, 'localhost'); + // TODO: Handle TCP writes to console + } +} + +new FakeRuntime(); diff --git a/main/MenuTemplate/DawnMenu.js b/main/MenuTemplate/DawnMenu.ts similarity index 80% rename from main/MenuTemplate/DawnMenu.js rename to main/MenuTemplate/DawnMenu.ts index 377ae465..594a7731 100644 --- a/main/MenuTemplate/DawnMenu.js +++ b/main/MenuTemplate/DawnMenu.ts @@ -2,10 +2,10 @@ * Defines the Dawn menu */ -import { app } from 'electron'; +import { app, MenuItemConstructorOptions } from 'electron'; import RendererBridge from '../RendererBridge'; -const DawnMenu = { +const DawnMenu: MenuItemConstructorOptions = { label: 'Dawn', submenu: [ { diff --git a/main/MenuTemplate/DebugMenu.js b/main/MenuTemplate/DebugMenu.ts similarity index 61% rename from main/MenuTemplate/DebugMenu.js rename to main/MenuTemplate/DebugMenu.ts index 2f113081..c20a04dd 100644 --- a/main/MenuTemplate/DebugMenu.js +++ b/main/MenuTemplate/DebugMenu.ts @@ -1,8 +1,9 @@ -import { fork } from 'child_process'; +import { fork, ChildProcess } from 'child_process'; import RendererBridge from '../RendererBridge'; -import FCObject from '../networking/FieldControl'; +import { FCObject } from '../networking/FieldControl'; +import { MenuItemConstructorOptions } from 'electron'; -let fakeRuntime = null; +let fakeRuntime: ChildProcess | null = null; export function killFakeRuntime() { if (fakeRuntime) { @@ -12,13 +13,13 @@ export function killFakeRuntime() { } } -const DebugMenu = { +const DebugMenu: MenuItemConstructorOptions = { label: 'Debug', submenu: [ { label: 'Toggle DevTools', click() { - RendererBridge.registeredWindow.webContents.toggleDevTools(); + RendererBridge.toggleWindowDevtools('main'); }, accelerator: 'CommandOrControl+alt+I', }, @@ -33,8 +34,12 @@ const DebugMenu = { { label: 'Restart FC', click() { - FCObject.FCInternal.quit(); - FCObject.setup(); + if (FCObject.FCInternal !== null) { + FCObject.FCInternal.quit(); + FCObject.setup(); + } else { + console.log('Field Control not active'); + } }, }, { @@ -50,7 +55,7 @@ const DebugMenu = { label: 'Reload', accelerator: 'CommandOrControl+R', click() { - RendererBridge.registeredWindow.reload(); + RendererBridge.reloadWindow('main'); }, }, @@ -66,13 +71,13 @@ const DebugMenu = { }; if (process.env.NODE_ENV === 'development') { - DebugMenu.submenu.push({ + (DebugMenu.submenu as MenuItemConstructorOptions[]).push({ // Need to type cast since submenu's type isn't always array label: 'Toggle Fake Runtime', click() { if (fakeRuntime) { killFakeRuntime(); } else { - fakeRuntime = fork('./fake-runtime/FakeRuntime'); + fakeRuntime = fork('./fake-runtime/FakeRuntime.ts', [], { execArgv: ['-r', 'ts-node/register']}); } }, }); diff --git a/main/MenuTemplate/EditMenu.js b/main/MenuTemplate/EditMenu.ts similarity index 78% rename from main/MenuTemplate/EditMenu.js rename to main/MenuTemplate/EditMenu.ts index 3da38955..fe4e6eb8 100644 --- a/main/MenuTemplate/EditMenu.js +++ b/main/MenuTemplate/EditMenu.ts @@ -2,7 +2,9 @@ * Defines the edit menu. */ -const EditMenu = { +import { MenuItemConstructorOptions } from "electron"; + +const EditMenu: MenuItemConstructorOptions = { label: 'Edit', submenu: [ { diff --git a/main/MenuTemplate/FileMenu.js b/main/MenuTemplate/FileMenu.ts similarity index 89% rename from main/MenuTemplate/FileMenu.js rename to main/MenuTemplate/FileMenu.ts index 280759cd..13bf72da 100644 --- a/main/MenuTemplate/FileMenu.js +++ b/main/MenuTemplate/FileMenu.ts @@ -8,8 +8,9 @@ import { saveFile, createNewFile, } from '../../renderer/actions/EditorActions'; +import { MenuItemConstructorOptions } from 'electron'; -const FileMenu = { +const FileMenu: MenuItemConstructorOptions = { label: 'File', submenu: [ { diff --git a/main/MenuTemplate/HelpMenu.js b/main/MenuTemplate/HelpMenu.ts similarity index 71% rename from main/MenuTemplate/HelpMenu.js rename to main/MenuTemplate/HelpMenu.ts index c23aa0b0..27df46c9 100644 --- a/main/MenuTemplate/HelpMenu.js +++ b/main/MenuTemplate/HelpMenu.ts @@ -3,14 +3,15 @@ */ import RendererBridge from '../RendererBridge'; import showAPI from '../main-process'; +import { MenuItemConstructorOptions } from 'electron'; -const HelpMenu = { +const HelpMenu: MenuItemConstructorOptions = { label: 'Help', submenu: [ { label: 'Interactive Tutorial', click() { - RendererBridge.registeredWindow.webContents.send('start-interactive-tour'); + RendererBridge.dispatch('main', 'start-interactive-tour'); }, accelerator: 'CommandOrControl+T', }, diff --git a/main/MenuTemplate/Template.js b/main/MenuTemplate/Template.ts similarity index 100% rename from main/MenuTemplate/Template.js rename to main/MenuTemplate/Template.ts diff --git a/main/RendererBridge.js b/main/RendererBridge.js deleted file mode 100644 index caf9ee75..00000000 --- a/main/RendererBridge.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * RendererBridge connects the main process to the renderer's Redux flow. - * Maintains a real-time copy of the renderer's Redux state in the main process, and - * allows the main process to dispatch redux actions to the renderer. - */ - -import _ from 'lodash'; - -const RendererBridge = { - registeredWindow: null, - - registerWindow(electronWindow) { - this.registeredWindow = electronWindow; - }, - - reduxDispatch(action) { - if (this.registeredWindow) { - this.registeredWindow.webContents.send('dispatch', action); - } - }, -}; - -_.bindAll(RendererBridge, ['registerWindow', 'reduxDispatch']); - -export default RendererBridge; diff --git a/main/RendererBridge.ts b/main/RendererBridge.ts new file mode 100644 index 00000000..149716ba --- /dev/null +++ b/main/RendererBridge.ts @@ -0,0 +1,82 @@ +/** + * RendererBridge connects the main process to children renderer processes and + * allows the main process to dispatch data to the renderer processes. + */ + +import _ from 'lodash'; +import { BrowserWindow } from "electron"; + +type SingleOrArray = T | T[]; + +class RendererBridge { + private registeredWindows: Record = {}; + + hasRegisteredWindow = (key: string) => this.registeredWindows[key] ?? false; + + /** Registers the window in the RendererBridge */ + registerWindow = (key: string, electronWindow: BrowserWindow) => { + this.registeredWindows[key] = electronWindow; + }; + + /** Unregisters the window from the RendererBridge */ + unregisterWindow = (key: string) => { + delete this.registeredWindows[key]; + } + + /** + * Reloads the window specified by its key in the RendererBridge + * If key specified doesn't exist in the RendererBridge, then nothing will happen. + */ + reloadWindow = (key: string) => { + const registeredWindow = this.registeredWindows[key]; + registeredWindow?.reload(); + } + + /** + * Toggles the window DevTools for window specified by key + * If key specified doesn't exist in the RendererBridge, then nothing will happen. + */ + toggleWindowDevtools = (key: string) => { + const registeredWindow = this.registeredWindows[key]; + registeredWindow?.webContents.toggleDevTools(); + } + + /** + * From windows specified by `windowKeys`, dispatches `data` to `channel`. + * If `windowKeys` is undefined, will send to all registered windows. + * If `windowKeys` is a `string`, then the data will only be dispatched to that registered window. + */ + dispatch = (windowKeys: SingleOrArray | 'all', channel: string, ...data: any[]) => { + if (windowKeys === 'all') { + windowKeys = Object.keys(this.registeredWindows); + } else if (typeof windowKeys === 'string') { + windowKeys = [windowKeys] + } + + try { + for (const key of windowKeys) { + const registeredWindow = this.registeredWindows[key]; + + // Special case for dispatching Redux since we can only dispatch one action at a time + if (channel === 'reduxDispatch') { + data = data[0]; + } + + registeredWindow?.webContents.send(channel, data); + } + } catch (e) { + console.log(`[RendererBridge] dispatch caught error:`, e) + } + } + + /** + * More particular usage of `dispatch`. Use this method if windows you are sending to + * have a Redux store. The default window for this method will have key `'main'` which will dispatch + * Redux actions to the main window to avoid large refactors from the current usage of this method. + */ + reduxDispatch = (action: any, windowKeys: SingleOrArray | 'all' | 'main' = 'main') => { + this.dispatch(windowKeys, 'reduxDispatch', action); + }; +}; + +export default new RendererBridge(); diff --git a/main/main-process.js b/main/main-process.ts similarity index 68% rename from main/main-process.js rename to main/main-process.ts index 5f0dbef8..dadb2309 100644 --- a/main/main-process.js +++ b/main/main-process.ts @@ -9,24 +9,24 @@ import installExtension, { REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS } from 'electro import RendererBridge from './RendererBridge'; import { killFakeRuntime } from './MenuTemplate/DebugMenu'; import Template from './MenuTemplate/Template'; -import Ansible from './networking/Ansible'; -import FCObject from './networking/FieldControl'; - +import { FCObject, Runtime } from './networking'; app.on('window-all-closed', () => { app.quit(); }); app.on('will-quit', () => { - Ansible.close(); - FCObject.FCInternal.quit(); + Runtime.close(); + if (FCObject.FCInternal !== null) { + FCObject.FCInternal.quit(); + } if (process.env.NODE_ENV === 'development') { killFakeRuntime(); } }); -function initializeFC(event) { // eslint-disable-line no-unused-vars +function initializeFC(_event: any) { // eslint-disable-line no-unused-vars try { FCObject.setup(); } catch (err) { @@ -34,16 +34,16 @@ function initializeFC(event) { // eslint-disable-line no-unused-vars } } -function teardownFC(event) { // eslint-disable-line no-unused-vars +function teardownFC(_event: any) { // eslint-disable-line no-unused-vars if (FCObject.FCInternal !== null) { FCObject.FCInternal.quit(); } } export default function showAPI() { - let api = new BrowserWindow({ + let api: BrowserWindow | null = new BrowserWindow({ webPreferences: { - nodeIntegration: false, + nodeIntegration: true, }, width: 1400, height: 900, @@ -54,20 +54,27 @@ export default function showAPI() { }); api.loadURL(`file://${__dirname}/../static/website-robot-api-master/robot_api.html`); api.once('ready-to-show', () => { - api.show(); + if (api) { + api.show(); + } }); } app.on('ready', () => { - Ansible.setup(); + Runtime.setup(); ipcMain.on('FC_CONFIG_CHANGE', FCObject.changeFCInfo); ipcMain.on('FC_INITIALIZE', initializeFC); ipcMain.on('FC_TEARDOWN', teardownFC); - const mainWindow = new BrowserWindow(); + const mainWindow = new BrowserWindow({ + webPreferences: { + nodeIntegration: true, + enableRemoteModule: true + } + }); // Binding for the main process to inject into Redux workflow - RendererBridge.registerWindow(mainWindow); + RendererBridge.registerWindow('main', mainWindow); mainWindow.maximize(); mainWindow.loadURL(`file://${__dirname}/../static/index.html`); @@ -76,15 +83,15 @@ app.on('ready', () => { Menu.setApplicationMenu(menu); if (process.env.NODE_ENV !== 'production') { - installExtension(REACT_DEVELOPER_TOOLS).then((name) => { + installExtension(REACT_DEVELOPER_TOOLS).then((name: string) => { console.log(`Added Extension: ${name}`); - }).catch((err) => { + }).catch((err: Error) => { console.log('An error occurred: ', err); }); - installExtension(REDUX_DEVTOOLS).then((name) => { + installExtension(REDUX_DEVTOOLS).then((name: string) => { console.log(`Added Extension: ${name}`); - }).catch((err) => { + }).catch((err: Error) => { console.log('An error occurred: ', err); }); } diff --git a/main/networking/Ansible.js b/main/networking/Ansible.js deleted file mode 100644 index 630ca908..00000000 --- a/main/networking/Ansible.js +++ /dev/null @@ -1,285 +0,0 @@ -import dgram from 'dgram'; -import net from 'net'; -import { ipcMain } from 'electron'; -import protobuf from 'protobufjs'; -import _ from 'lodash'; - -import RendererBridge from '../RendererBridge'; -import { updateConsole } from '../../renderer/actions/ConsoleActions'; -import { - ansibleDisconnect, - infoPerMessage, - updateCodeStatus, -} from '../../renderer/actions/InfoActions'; -import { updatePeripherals } from '../../renderer/actions/PeripheralActions'; -import { robotState, Logger, defaults } from '../../renderer/utils/utils'; -import FCObject from './FieldControl'; - -const DawnData = (new protobuf.Root()).loadSync(`${__dirname}/ansible.proto`, { keepCase: true }).lookupType('DawnData'); -const { StudentCodeStatus } = DawnData; - -const RuntimeData = (new protobuf.Root()).loadSync(`${__dirname}/runtime.proto`, { keepCase: true }).lookupType('RuntimeData'); -const Notification = (new protobuf.Root()).loadSync(`${__dirname}/notification.proto`, { keepCase: true }).lookupType('Notification'); - -const LISTEN_PORT = 1235; -const SEND_PORT = 1236; -const TCP_PORT = 1234; - -function buildProto(data) { - let status = null; - switch (data.studentCodeStatus) { - case robotState.TELEOP: - status = StudentCodeStatus.TELEOP; - break; - case robotState.AUTONOMOUS: - status = StudentCodeStatus.AUTONOMOUS; - break; - case robotState.ESTOP: - status = StudentCodeStatus.ESTOP; - break; - default: - status = StudentCodeStatus.IDLE; - } - - const gamepads = _.map(_.toArray(data.gamepads), (gamepad) => { - const axes = _.toArray(gamepad.axes); - const buttons = _.map(_.toArray(gamepad.buttons), Boolean); - return DawnData.Gamepad.create({ - index: gamepad.index, - axes, - buttons, - }); - }); - - return DawnData.create({ - student_code_status: status, - gamepads, - team_color: (FCObject.stationNumber < 2) ? DawnData.TeamColor.BLUE : DawnData.TeamColor.GOLD, - }); -} - -class ListenSocket { - constructor(logger) { - this.logger = logger; - this.statusUpdateTimeout = 0; - this.socket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); - this.studentCodeStatusListener = this.studentCodeStatusListener.bind(this); - this.close = this.close.bind(this); - /* - * Runtime message handler. Sends robot state to store.info - * and raw sensor array to peripheral reducer - */ - this.socket.on('message', (msg) => { - try { - const { - robot_state: stateRobot, - sensor_data: sensorData, - } = RuntimeData.decode(msg); - this.logger.debug(`Dawn received UDP with state ${stateRobot}`); - RendererBridge.reduxDispatch(infoPerMessage(stateRobot)); - if (stateRobot === RuntimeData.State.STUDENT_STOPPED) { - if (this.statusUpdateTimeout > 0) { - this.statusUpdateTimeout -= 1; - } else { - this.statusUpdateTimeout = 0; - RendererBridge.reduxDispatch(updateCodeStatus(robotState.IDLE)); - } - } - this.logger.debug(JSON.stringify(sensorData)); - RendererBridge.reduxDispatch(updatePeripherals(sensorData)); - } catch (err) { - this.logger.log('Error decoding UDP'); - this.logger.debug(err); - } - }); - - this.socket.on('error', (err) => { - this.logger.log('UDP listening error'); - this.logger.debug(err); - }); - - this.socket.on('close', () => { - RendererBridge.reduxDispatch(ansibleDisconnect()); - this.logger.log('UDP listening closed'); - }); - - this.socket.bind(LISTEN_PORT, () => { - this.logger.log(`UDP Bound to ${LISTEN_PORT}`); - }); - ipcMain.on('studentCodeStatus', this.studentCodeStatusListener); - } - - studentCodeStatusListener(event, { studentCodeStatus }) { - if (studentCodeStatus === StudentCodeStatus.TELEOP || - studentCodeStatus === StudentCodeStatus.AUTONOMOUS) { - this.statusUpdateTimeout = 5; - } - } - - close() { - this.socket.close(); - ipcMain.removeListener('studentCodeStatus', this.studentCodeStatusListener); - } -} - -class SendSocket { - constructor(logger) { - this.logger = logger; - this.runtimeIP = defaults.IPADDRESS; - this.socket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); - this.sendGamepadMessages = this.sendGamepadMessages.bind(this); - this.ipAddressListener = this.ipAddressListener.bind(this); - this.close = this.close.bind(this); - - this.socket.on('error', (err) => { - this.logger.log('UDP sending error'); - this.logger.log(err); - }); - - this.socket.on('close', () => { - this.logger.log('UDP sending closed'); - }); - - ipcMain.on('stateUpdate', this.sendGamepadMessages); - - /* - * IPC Connection with ConfigBox.js' saveChanges() - * Receives new IP Address to send messages to. - */ - ipcMain.on('ipAddress', this.ipAddressListener); - } - - /* - * IPC Connection with sagas.js' ansibleGamepads() - * Sends messages when Gamepad information changes - * or when 100 ms has passed (with 50 ms cooldown) - */ - sendGamepadMessages(event, data) { - const message = DawnData.encode(buildProto(data)).finish(); - this.logger.debug(`Dawn sent UDP to ${this.runtimeIP}`); - this.socket.send(message, SEND_PORT, this.runtimeIP); - } - - ipAddressListener(event, { ipAddress }) { - this.runtimeIP = ipAddress; - } - - close() { - this.socket.close(); - ipcMain.removeListener('stateUpdate', this.sendGamepadMessages); - ipcMain.removeListener('ipAddress', this.ipAddressListener); - } -} - -class TCPSocket { - constructor(socket, logger) { - this.requestTimestamp = this.requestTimestamp.bind(this); - this.sendFieldControl = this.sendFieldControl.bind(this); - this.close = this.close.bind(this); - - this.logger = logger; - this.socket = socket; - - this.logger.log('Runtime connected'); - this.socket.on('end', () => { - this.logger.log('Runtime disconnected'); - }); - - this.socket.on('data', (data) => { - const decoded = Notification.decode(data); - this.logger.log(`Dawn received TCP Packet ${decoded.header}`); - - switch (decoded.header) { - case Notification.Type.CONSOLE_LOGGING: - RendererBridge.reduxDispatch(updateConsole(decoded.console_output)); - break; - case Notification.Type.TIMESTAMP_UP: - this.logger.log(`TIMESTAMP: ${_.toArray(decoded.timestamps)}`); - break; - } - }); - - /* - * IPC Connection with Editor.js' upload() - * When Runtime responds back with confirmation, - * notifyChange sends received signal (see tcp, received variables) - */ - ipcMain.on('TIMESTAMP_SEND', this.requestTimestamp); - } - - requestTimestamp() { - const TIME = Date.now() / 1000.0; - const message = Notification.encode(Notification.create({ - header: Notification.Type.TIMESTAMP_DOWN, - timestamps: [TIME], - })).finish(); - - this.socket.write(message, () => { - this.logger.log(`Timestamp Requested: ${TIME}`); - }); - } - - sendFieldControl(data) { - const rawMsg = { - header: Notification.Type.GAMECODE_TRANSMISSION, - gamecode_solutions: data.solutions, - gamecodes: data.codes, - rfids: data.rfids, - }; - const message = Notification.encode(Notification.create(rawMsg)).finish(); - - this.socket.write(message, () => { - this.logger.log(`FC Message Sent: ${rawMsg}`); - }); - } - - close() { - this.socket.end(); - } -} - -class TCPServer { - constructor(logger) { - this.socket = null; - this.close = this.close.bind(this); - this.tcp = net.createServer((socket) => { - this.socket = new TCPSocket(socket, logger); - }); - - this.logger = logger; - - this.tcp.on('error', (err) => { - this.logger.log('TCP error'); - this.logger.log(err); - }); - - this.tcp.listen(TCP_PORT, () => { - this.logger.log(`Dawn listening on port ${TCP_PORT}`); - }); - } - - close() { - if (this.socket) { - this.socket.close(); - } - - this.tcp.close(); - } -} - -const Ansible = { - conns: [], - logger: new Logger('ansible', 'Ansible Debug'), - setup() { - this.conns = [ - new ListenSocket(this.logger), - new SendSocket(this.logger), - new TCPServer(this.logger), - ]; - }, - close() { - this.conns.forEach(conn => conn.close()); // Logger's fs closes automatically - }, -}; - -export default Ansible; diff --git a/main/networking/FieldControl.js b/main/networking/FieldControl.ts similarity index 64% rename from main/networking/FieldControl.js rename to main/networking/FieldControl.ts index d12ccc50..035389d3 100644 --- a/main/networking/FieldControl.js +++ b/main/networking/FieldControl.ts @@ -2,12 +2,15 @@ import io from 'socket.io-client'; import { updateRobot, updateHeart, updateMaster } from '../../renderer/actions/FieldActions'; import RendererBridge from '../RendererBridge'; import { Logger } from '../../renderer/utils/utils'; -import Ansible from './Ansible'; class FCInternals { - constructor(stationNumber, bridgeAddress, logger) { + socket: SocketIOClient.Socket | null; + stationNumber: number; + bridgeAddress: string; + logger: Logger; + + constructor(stationNumber: number, bridgeAddress: string, logger: Logger) { this.socket = null; - this.queuedPublish = null; this.stationNumber = stationNumber; this.bridgeAddress = bridgeAddress; this.logger = logger; @@ -20,20 +23,21 @@ class FCInternals { this.socket = io(`http://${this.bridgeAddress}:7000`); this.socket.on('connect', () => { this.logger.log('Connected to Field Control Socket'); - this.socket.on('robot_state', (data) => { + this.socket!.on('robot_state', (data: any) => { RendererBridge.reduxDispatch(updateRobot(JSON.parse(data))); }); - this.socket.on('heartbeat', () => { + this.socket!.on('heartbeat', () => { RendererBridge.reduxDispatch(updateHeart()); }); - this.socket.on('codes', (data) => { - if (Ansible.conns[2].socket !== null) { - Ansible.conns[2].socket.sendFieldControl(JSON.parse(data)); - } else { - this.logger.log('Trying to send FC Info to Disconnected Robot'); - } - }); - this.socket.on('master', (data) => { + // NOTE: This listener may be deprecated + // this.socket.on('codes', (data: any) => { + // if (Runtime.conns[2].socket !== null) { + // Runtime.conns[2].socket.sendFieldControl(JSON.parse(data)); + // } else { + // this.logger.log('Trying to send FC Info to Disconnected Robot'); + // } + // }); + this.socket!.on('master', (data: any) => { RendererBridge.reduxDispatch(updateMaster(JSON.parse(data))); }); }); @@ -41,7 +45,9 @@ class FCInternals { quit() { try { - this.socket.close(); + if (this.socket) { + this.socket.close(); + } } catch (err) { this.logger.log(err); } @@ -49,8 +55,10 @@ class FCInternals { } } -const FCObject = { - FCInternal: null, +const FCInternalInit: any = null; + +export const FCObject = { + FCInternal: FCInternalInit, stationNumber: 4, bridgeAddress: 'localhost', logger: new Logger('fieldControl', 'Field Control Debug'), @@ -61,18 +69,13 @@ const FCObject = { this.FCInternal = new FCInternals(this.stationNumber, this.bridgeAddress, FCObject.logger); this.FCInternal.init(); }, - changeFCInfo(event, arg) { + changeFCInfo(_event: any, arg: any) { if (arg.stationNumber !== null) { FCObject.stationNumber = arg.stationNumber; - FCObject.logger.log(`stationNumber set to ${FCObject.stationNumber}`); } if (arg.bridgeAddress !== null) { FCObject.bridgeAddress = arg.bridgeAddress; - FCObject.logger.log(`bridgeAddress set to ${FCObject.bridgeAddress}`); } }, }; - - -export default FCObject; diff --git a/main/networking/Runtime.ts b/main/networking/Runtime.ts new file mode 100644 index 00000000..efb6d4cc --- /dev/null +++ b/main/networking/Runtime.ts @@ -0,0 +1,517 @@ +import { createSocket, Socket as UDPSocket } from 'dgram'; +import { Socket as TCPSocket } from 'net'; +import { ipcMain, IpcMainEvent } from 'electron'; +import * as protos from '../../protos/protos'; + +import RendererBridge from '../RendererBridge'; +import { updateConsole } from '../../renderer/actions/ConsoleActions'; +import { runtimeDisconnect, infoPerMessage } from '../../renderer/actions/InfoActions'; +import { updatePeripherals } from '../../renderer/actions/PeripheralActions'; +import { Logger, defaults } from '../../renderer/utils/utils'; +import { Peripheral } from '../../renderer/types'; +import { setLatencyValue } from '../../renderer/actions/EditorActions'; + +/** + * Define port constants, which must match with Runtime + */ +const UDP_SEND_PORT = 9000; +const UDP_LISTEN_PORT = 9001; +const DEFAULT_TCP_PORT = 8101; + +/** + * Runtime IP Address used for TCP and UDP connections + */ +let runtimeIP = defaults.IPADDRESS; + +/** + * Define message ID constants, which must match with Runtime + */ +enum MsgType { + RUN_MODE = 0, + START_POS = 1, + CHALLENGE_DATA = 2, + LOG = 3, + DEVICE_DATA = 4, + // 5 reserved for some Shepherd msg type + INPUTS = 6, + TIME_STAMPS = 7 +} + +interface TCPPacket { + type: MsgType; + length: number; + payload: Buffer; +} + +/** Given a data buffer, read as many TCP Packets as possible. + * If there are leftover bytes, return them so that they can be used in the next cycle of data. + */ +function readPackets( + data: Buffer, + previousLeftoverBytes?: Buffer +): { leftoverBytes: Buffer | undefined; processedTCPPackets: TCPPacket[] } { + const bytesToRead = Buffer.concat([previousLeftoverBytes ?? new Uint8Array(), data]); + let leftoverBytes; + let i = 0; + const processedTCPPackets: TCPPacket[] = []; + + while (i < bytesToRead.length) { + let header; + let msgType; + let msgLength; + let payload: Buffer; + + if (i + 3 <= bytesToRead.length) { + // Have enough bytes to read in 3 byte header + header = bytesToRead.slice(i, i + 3); + msgType = header[0]; + msgLength = (header[2] << 8) | header[1]; + } else { + // Don't have enough bytes to read 3 byte header so we save the bytes for the next data cycle + leftoverBytes = bytesToRead.slice(i); + + return { + leftoverBytes, + processedTCPPackets + }; + } + + i += 3; + + if (i + msgLength <= bytesToRead.length) { + // Have enough bytes to read entire payload from 1 TCP packet + payload = bytesToRead.slice(i, i + msgLength); + } else { + // Don't have enough bytes to read entire payload + leftoverBytes = bytesToRead.slice(i); + + return { + // Note: Need to save header so we know how many bytes to read for this packet in the next data cycle + leftoverBytes: Buffer.concat([header, leftoverBytes]), + processedTCPPackets + }; + } + + const newTCPPacket = { type: msgType, length: msgLength, payload: payload! }; + processedTCPPackets.push(newTCPPacket); + + i += msgLength; + } + + return { + leftoverBytes, + processedTCPPackets + }; +} + +/** + * Create TCP packet header and prepend to + * payload to send to Runtime. + */ +function createPacket(payload: unknown, messageType: MsgType): Buffer { + let encodedPayload: Uint8Array; + + switch (messageType) { + case MsgType.DEVICE_DATA: + encodedPayload = protos.DevData.encode(payload as protos.IDevData).finish(); + break; + case MsgType.RUN_MODE: + encodedPayload = protos.RunMode.encode(payload as protos.IRunMode).finish(); + break; + case MsgType.START_POS: + encodedPayload = protos.StartPos.encode(payload as protos.IStartPos).finish(); + break; + case MsgType.TIME_STAMPS: + encodedPayload = protos.TimeStamps.encode(payload as protos.ITimeStamps).finish(); + break; + case MsgType.CHALLENGE_DATA: + encodedPayload = protos.Text.encode(payload as protos.IText).finish(); + break; + case MsgType.INPUTS: + // Special case for 2021 competition where Input data is sent over tunneled TCP connection + encodedPayload = payload as Uint8Array; + break; + default: + console.log('ERROR: trying to create TCP Packet with type LOG'); + encodedPayload = new Uint8Array(); + break; + } + + const msgLength = Buffer.byteLength(encodedPayload); + const msgLengthArr = new Uint8Array([msgLength & 0x00ff, msgLength & 0xff00]); // Assuming little-endian byte order, since runs on x64 + const msgTypeArr = new Uint8Array([messageType]); + + return Buffer.concat([msgTypeArr, msgLengthArr, encodedPayload], msgLength + 3); +} + +/** Uses TCP connection to tunnel UDP messages. */ +class UDPTunneledConn { + /* Leftover bytes from reading 1 cycle of the TCP data buffer. */ + leftoverBytes: Buffer | undefined; + logger: Logger; + tcpSocket: TCPSocket; + udpForwarder: UDPSocket; + ip: string; + port: number; + + constructor(logger: Logger) { + this.logger = logger; + this.ip = defaults.IPADDRESS; + + this.tcpSocket = new TCPSocket(); + + // Connect to most recent IP + setInterval(() => { + if (!this.tcpSocket.connecting && this.tcpSocket.pending) { + if (this.ip !== defaults.IPADDRESS) { + if (this.ip.includes(':')) { + const split = this.ip.split(':'); + this.ip = split[0]; + this.port = Number(split[1]); + } + console.log(`UDPTunneledConn: Trying to TCP connect to ${this.ip}:${this.port}`); + this.tcpSocket.connect(this.port, this.ip); + } + } + }, 1000); + + this.tcpSocket.on('connect', () => { + this.logger.log(`UDPTunneledConn connected`); + }); + + this.tcpSocket.on('end', () => { + this.logger.log(`UDPTunneledConn disconnected`); + }); + + this.tcpSocket.on('error', (err: string) => { + this.logger.log(err); + }); + + this.tcpSocket.on('data', (data) => { + const { leftoverBytes, processedTCPPackets } = readPackets(data, this.leftoverBytes); + + try { + for (const packet of processedTCPPackets) { + // Send to UDP Connection + udpForwarder.send(packet.payload, 0, packet.payload.length, UDP_LISTEN_PORT, 'localhost'); + } + + this.leftoverBytes = leftoverBytes; + } catch (e) { + this.logger.log('UDPTunneledConn udpForwarder failed to send to UDP connection: ' + String(e)); + } + }); + + /* Bidirectional - Can send to and receive from UDP connection. */ + const udpForwarder = createSocket({ type: 'udp4', reuseAddr: true }); + + udpForwarder.bind(UDP_SEND_PORT, () => { + console.log(`UDP forwarder receives from port ${UDP_SEND_PORT}`); + }); + + // Received a new message from UDP connection + udpForwarder.on('message', (msg: Uint8Array) => { + const message = createPacket(msg, MsgType.INPUTS); + this.tcpSocket.write(message); + }); + + this.udpForwarder = udpForwarder; + + ipcMain.on('udpTunnelIpAddress', this.ipAddressListener); + } + + ipAddressListener = (_event: IpcMainEvent, ipAddress: string) => { + if (ipAddress != this.ip) { + console.log(`UDPTunneledConn - Switching IP from ${this.ip} to ${ipAddress}`); + if (this.tcpSocket.connecting || !this.tcpSocket.pending) { + this.tcpSocket.end(); + } + this.ip = ipAddress; + } + }; + + close = () => { + if (!this.tcpSocket.pending) { + this.tcpSocket.end(); + } + this.udpForwarder.close(); + ipcMain.removeListener('udpTunnelIpAddress', this.ipAddressListener); + }; +} + +class TCPConn { + logger: Logger; + socket: TCPSocket; + leftoverBytes: Buffer | undefined; + + constructor(logger: Logger) { + this.logger = logger; + this.socket = new TCPSocket(); + + // Connect to most recent IP + setInterval(() => { + if (!this.socket.connecting && this.socket.pending) { + if (runtimeIP !== defaults.IPADDRESS) { + let port = DEFAULT_TCP_PORT; + let ip = runtimeIP; + if (runtimeIP.includes(':')) { + const split = runtimeIP.split(':'); + ip = split[0]; + port = Number(split[1]); + } + console.log(`TCPConn: Trying to TCP connect to ${ip}:${port}`); + this.socket.connect(port, ip); + } + } + }, 1000); + + this.socket.on('connect', () => { + this.logger.log('Runtime connected'); + this.socket.write(new Uint8Array([1])); // Runtime needs first byte to be 1 to recognize client as Dawn (instead of Shepherd) + }); + + this.socket.on('end', () => { + this.logger.log('Runtime disconnected'); + }); + + this.socket.on('error', (err: string) => { + this.logger.log(err); + }); + + /** + * Runtime TCP Message Handler. + * TODO: Distinguish between challenge outputs and console logs + * when using payload to update console + */ + this.socket.on('data', (data) => { + const { leftoverBytes, processedTCPPackets } = readPackets(data, this.leftoverBytes); + + for (const packet of processedTCPPackets) { + let decoded; + + switch (packet.type) { + case MsgType.LOG: + decoded = protos.Text.decode(packet.payload); + RendererBridge.reduxDispatch(updateConsole(decoded.payload)); + break; + case MsgType.TIME_STAMPS: + decoded = protos.TimeStamps.decode(packet.payload); + const oneWayLatency = (Date.now() - Number(decoded.dawnTimestamp)) / 2; + + // TODO: we can probably do an average of n timestamps so the display doesn't change too frequently + + RendererBridge.reduxDispatch(setLatencyValue(oneWayLatency)) + break; + case MsgType.CHALLENGE_DATA: + // TODO: Dispatch challenge outputs to redux + break; + } + } + + this.leftoverBytes = leftoverBytes; + }); + + /** + * TCP Socket IPC Connections + */ + ipcMain.on('runModeUpdate', this.sendRunMode); + ipcMain.on('ipAddress', this.ipAddressListener); + ipcMain.on('initiateLatencyCheck', this.initiateLatencyCheck); + } + + /** + * Initiates latency check by sending first packet to Runtime + */ + initiateLatencyCheck = (_event: IpcMainEvent, data: protos.ITimeStamps) => { + if (this.socket.pending) { + return; + } + + const message = createPacket(data, MsgType.TIME_STAMPS); + this.socket.write(message, () => { + this.logger.log(`Sent timestamp data to runtime: ${JSON.stringify(data)}`); + }) + } + + /** + * IPC Connection with ConfigBox.ts' saveChanges() + * Receives new IP Address to send messages to. + */ + ipAddressListener = (_event: IpcMainEvent, ipAddress: string) => { + if (ipAddress != runtimeIP) { + console.log(`TCPConn - Switching IP from ${runtimeIP} to ${ipAddress}`); + if (this.socket.connecting || !this.socket.pending) { + this.socket.end(); + } + runtimeIP = ipAddress; + } + }; + + // TODO: We can possibly combine below methods into single handler. + + /** + * IPC Connection with sagas.js' exportRunMode() + * Receives new run mode to send to Runtime + */ + sendRunMode = (_event: IpcMainEvent, runModeData: protos.IRunMode) => { + if (this.socket.pending) { + return; + } + + const message = createPacket(runModeData, MsgType.RUN_MODE); + this.socket.write(message, () => { + this.logger.log(`Run Mode message sent: ${JSON.stringify(runModeData)}`); + }); + }; + + sendDevicePreferences = (_event: IpcMainEvent, deviceData: protos.IDevData) => { + // TODO: Get device preference filter from UI components, then sagas + if (this.socket.pending) { + return; + } + + // TODO: Serialize uid from string -> Long type + const message = createPacket(deviceData, MsgType.DEVICE_DATA); + this.socket.write(message, () => { + this.logger.log(`Device preferences sent: ${deviceData.toString()}`); + }); + }; + + sendChallengeInputs = (_event: IpcMainEvent, textData: protos.IText) => { + // TODO: Get challenge inputs from UI components, then sagas + if (this.socket.pending) { + return; + } + + const message = createPacket(textData, MsgType.CHALLENGE_DATA); + this.socket.write(message, () => { + this.logger.log(`Challenge inputs sent: ${textData.toString()}`); + }); + } + + sendRobotStartPos = (_event: IpcMainEvent, startPosData: protos.IStartPos) => { + // TODO: Get start pos from sagas + if (this.socket.pending) { + return; + } + + const message = createPacket(startPosData, MsgType.START_POS); + this.socket.write(message, () => { + this.logger.log(`Start position sent: ${startPosData.toString()}`); + }); + }; + + close = () => { + this.socket.end(); + ipcMain.removeListener('runModeUpdate', this.sendRunMode); + ipcMain.removeListener('ipAddress', this.ipAddressListener); + ipcMain.removeListener('initiateLatencyCheck', this.initiateLatencyCheck); + }; +} + +/** + * UDPConn contains socket methods for both sending to and receiving from Runtime. + */ +class UDPConn { + logger: Logger; + socket: UDPSocket; + + constructor(logger: Logger) { + this.logger = logger; + + this.socket = createSocket({ type: 'udp4', reuseAddr: true }); + + this.socket.on('error', (err: string) => { + this.logger.log('UDP connection error'); + this.logger.log(err); + }); + + this.socket.on('close', () => { + RendererBridge.reduxDispatch(runtimeDisconnect()); + this.logger.log('UDP connection closed'); + }); + + /** + * Runtime UDP Message Handler. + * In other words, this is where we handle data that we receive from Runtime. + * Sets runtime connection, decodes device message, cleans UIDs from uint64, and sends sensor data array to reducer. + */ + this.socket.on('message', (msg: Uint8Array) => { + try { + RendererBridge.reduxDispatch(infoPerMessage()); + const sensorData: protos.Device[] = protos.DevData.decode(msg).devices; + // Need to convert protos.Device to Peripheral here because when dispatching to the renderer over IPC, + // some of the inner properties (i.e. device.uid which is a Long) loses its prototype, which means any + // data we are sending over through IPC should be serializable. + // https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm + const peripherals: Peripheral[] = []; + + sensorData.forEach((device) => { + // There is a weird bug that happens with the protobufs decoding when device.type is specifically 0 + // where the property can be accessed but when trying to view object contents, the property doesn't exist. + // Below is a way to get around this problem. + if (device.type.toString() === '0') { + device.type = 0; + } + + peripherals.push({ ...device, uid: device.uid.toString() }); + }); + + RendererBridge.reduxDispatch(updatePeripherals(peripherals)); + } catch (err) { + this.logger.log('Error decoding UDP'); + this.logger.log(err); + } + }); + + this.socket.bind(UDP_LISTEN_PORT, 'localhost', () => { + this.logger.log(`UDP connection bound`); + }); + + /** + * UDP Send Socket IPC Connections + */ + ipcMain.on('stateUpdate', this.sendInputs); + } + + /** + * IPC Connection with sagas.ts' runtimeGamepads() + * Sends messages when Gamepad information changes + * or when 100 ms has passed (with 50 ms cooldown) + */ + sendInputs = (_event: IpcMainEvent, data: protos.Input[], source: protos.Source) => { + if (data.length === 0) { + data.push( + protos.Input.create({ + connected: false, + source + }) + ); + } + + const message = protos.UserInputs.encode({ inputs: data }).finish(); + + // Change IP to use runtimeIP again after 2021 Competition + this.socket.send(message, UDP_SEND_PORT, 'localhost'); + }; + + close() { + this.socket.close(); + ipcMain.removeListener('stateUpdate', this.sendInputs); + } +} + +const RuntimeConnections: Array = []; + +export const Runtime = { + conns: RuntimeConnections, + logger: new Logger('runtime', 'Runtime Debug'), + + setup() { + this.conns = [new UDPConn(this.logger), new TCPConn(this.logger), new UDPTunneledConn(this.logger)]; + }, + + close() { + this.conns.forEach((conn) => conn.close()); // Logger's fs closes automatically + } +}; diff --git a/main/networking/index.ts b/main/networking/index.ts new file mode 100644 index 00000000..173ca4a2 --- /dev/null +++ b/main/networking/index.ts @@ -0,0 +1,2 @@ +export { FCObject } from './FieldControl'; +export { Runtime } from './Runtime'; diff --git a/package.json b/package.json index 52160a4f..4910f2e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { - "name": "Dawn", - "version": "2.1.0", + "name": "dawn", + "productName": "Dawn", + "version": "3.0.0", "description": "Frontend for PIE Robotics System", "license": "Apache-2.0", "private": true, @@ -8,32 +9,68 @@ "type": "git", "url": "https://github.com/pioneers/dawn.git" }, + "prettier": { + "semi": true, + "singleQuote": true, + "printWidth": 140, + "arrowParens": "always", + "parser": "typescript", + "bracketSpacing": true, + "trailingComma": "none" + }, "main": "build/main.js", "scripts": { "start": "better-npm-run start", - "build": "better-npm-run build", - "pkg": "node release.js", - "lint": "eslint .", + "build": "rimraf build && better-npm-run build", + "lint-actions": "eslint renderer/actions/**/*.ts", + "lint-reducers": "eslint renderer/reducers/**/*.ts", + "lint-types": "eslint renderer/types/**/*.ts", + "lint-components": "eslint renderer/components/**/*.ts", + "lint-actions-fix": "eslint renderer/actions/**/*.ts --fix", + "lint-reducers-fix": "eslint renderer/reducers/**/*.ts --fix", + "lint-types-fix": "eslint renderer/types/**/*.ts --fix", + "lint-components-fix": "eslint renderer/components/**/*.ts --fix", + "lint": "eslint '*/**/*.ts?(x)'", + "lintfix": "eslint '*/**/*.ts?(x)' --fix", + "postinstall": "patch-package", + "build-protos": "pbjs -t static-module -w es6 -o protos/protos.js protos/*.proto && pbts -o protos/protos.d.ts protos/protos.js ", "watch": "webpack --mode development --watch --progress", "test": "mocha --require babel-core/register --recursive renderer/**/test/*.test.js", - "release": "node release.js", + "release": "yarn build && ts-node release.ts", "version": "echo $npm_package_version" }, "betterScripts": { "start": { - "command": "cp ./old-protos/*.proto ./build && electron build/main.js", + "command": "mkdirp ./build/protos && cp ./protos/*.proto ./build/protos && electron build/main.js", "env": { "NODE_ENV": "development" } }, "build": { - "command": "mkdir -p ./build && cp ../old-protos/*.proto ./build && webpack --mode production --progress", + "command": "mkdirp ./build/protos && cp ./protos/*.proto ./build/protos && webpack --mode production --progress", "env": { "NODE_ENV": "production" } } }, "devDependencies": { + "@types/electron-devtools-installer": "^2.2.0", + "@types/electron-json-storage": "^4.0.0", + "@types/keymirror": "^0.1.1", + "@types/lodash": "^4.14.159", + "@types/minimist": "^1.2.0", + "@types/node": "^14.0.14", + "@types/numeral": "^0.0.28", + "@types/react": "^16.9.43", + "@types/react-bootstrap": "^0.32.22", + "@types/react-dom": "^16.9.8", + "@types/react-joyride": "^2.0.5", + "@types/react-redux": "^7.1.9", + "@types/seedrandom": "^2.4.28", + "@types/socket.io-client": "^1.4.33", + "@types/ssh2": "^0.5.44", + "@typescript-eslint/eslint-plugin": "^3.7.0", + "@typescript-eslint/parser": "^3.8.0", "babel-core": "6.26.0", "babel-loader": "7.1.3", "babel-preset-env": "1.6.1", @@ -41,52 +78,68 @@ "babel-preset-stage-3": "6.24.1", "better-npm-run": "0.1.0", "chai": "4.1.2", - "electron-devtools-installer": "2.2.4", - "electron-packager": "^10.1.1", - "eslint": "4.18.2", + "css-loader": "^4.3.0", + "electron": ">=7.2.4", + "electron-devtools-installer": "^3.1.1", + "electron-packager": "^15.2.0", + "eslint": "^7.5.0", "eslint-config-airbnb": "16.1.0", + "eslint-config-prettier": "^6.11.0", "eslint-loader": "2.0.0", "eslint-plugin-import": "2.8.0", + "eslint-plugin-jsdoc": "^30.2.1", "eslint-plugin-jsx-a11y": "6.0.3", + "eslint-plugin-prettier": "^3.1.4", "eslint-plugin-react": "7.5.1", + "eslint-plugin-react-hooks": "^4.2.0", + "file-loader": "^6.1.0", "fs-extra": "5.0.0", + "jsdoc": "^3.6.6", "jszip": "3.1.5", "minimist": "1.2.3", + "mkdirp": "^1.0.4", "mocha": "5.0.0", - "webpack": "4.1.0", + "prettier": "^2.0.5", + "rimraf": "^3.0.2", + "style-loader": "^1.2.1", + "ts-loader": "^8.0.2", + "typescript": "^3.9.7", + "webpack": "^4.44.2", "webpack-cli": "2.0.10", "zip-webpack-plugin": "3.0.0" }, "dependencies": { - "brace": "0.11.0", + "ace-builds": "^1.4.12", "bufferutil": "4.0.1", "create-react-class": "15.6.2", - "electron": ">=1.7.16", "electron-json-storage": "4.0.2", "immutable": "3.8.2", "json-loader": "0.5.7", "keymirror": "0.1.1", - "lodash": ">=4.17.13", + "lodash": ">=4.17.21", "mousetrap": "1.6.1", "numeral": "2.0.6", "object-assign": "4.1.1", + "patch-package": "^6.2.2", + "postinstall-postinstall": "^2.1.0", "prop-types": "15.6.0", - "protobufjs": ">=6.8.6", - "react": "16.2.0", - "react-ace": "5.9.0", + "protobufjs": "^6.10.2", + "react": "^16.13.1", + "react-ace": "^9.1.3", "react-bootstrap": "0.32.0", - "react-dom": ">=16.2.1", + "react-dom": "^16.13.1", "react-immutable-proptypes": "2.1.0", - "react-joyride": "1.11.1", - "react-redux": "5.0.6", - "redux": "3.7.2", - "redux-saga": "0.16.0", + "react-joyride": "^2.2.1", + "react-redux": "^7.2.1", + "redux": "^4.0.5", + "redux-saga": "^1.1.3", "seedrandom": "2.4.3", - "smalltalk": "2.5.1", - "socket.io-client": "^2.0.4", - "ssh2": "0.5.5", + "smalltalk": "^4.0.6", + "socket.io-client": "^2.3.0", + "ssh2": "^0.8.9", "superagent": "3.8.2", - "utf-8-validate": "4.0.0", + "ts-node": "^9.0.0", + "utf-8-validate": "^5.0.2", "ws": "4.0.0" } } diff --git a/patches/@types+node+14.0.14.patch b/patches/@types+node+14.0.14.patch new file mode 100644 index 00000000..80c8bb62 --- /dev/null +++ b/patches/@types+node+14.0.14.patch @@ -0,0 +1,12 @@ +diff --git a/node_modules/@types/node/net.d.ts b/node_modules/@types/node/net.d.ts +index c45aaa2..668c68e 100644 +--- a/node_modules/@types/node/net.d.ts ++++ b/node_modules/@types/node/net.d.ts +@@ -79,6 +79,7 @@ declare module "net" { + readonly bytesRead: number; + readonly bytesWritten: number; + readonly connecting: boolean; ++ readonly pending: boolean; + readonly destroyed: boolean; + readonly localAddress: string; + readonly localPort: number; diff --git a/patches/jsdoc+3.6.6.patch b/patches/jsdoc+3.6.6.patch new file mode 100644 index 00000000..2d45f280 --- /dev/null +++ b/patches/jsdoc+3.6.6.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/jsdoc/lib/jsdoc/src/handlers.js b/node_modules/jsdoc/lib/jsdoc/src/handlers.js +index 0c4e255..7498a05 100644 +--- a/node_modules/jsdoc/lib/jsdoc/src/handlers.js ++++ b/node_modules/jsdoc/lib/jsdoc/src/handlers.js +@@ -84,7 +84,7 @@ function createSymbolDoclet(comment, e) { + } + + function setCurrentModule(doclet) { +- if (doclet.kind === 'module') { ++ if (doclet.kind === 'module' && !doclet.isEnum) { + currentModule = new CurrentModule(doclet); + } + } diff --git a/protos/device.proto b/protos/device.proto new file mode 100644 index 00000000..63c23368 --- /dev/null +++ b/protos/device.proto @@ -0,0 +1,29 @@ +/* + * Defines a message for communicating Device Data + */ + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +//message for describing a single device parameter +message Param { + string name = 1; + oneof val { + float fval = 2; + int32 ival = 3; + bool bval = 4; + } +} + +//message for describing a single device +message Device { + string name = 1; + uint64 uid = 2; + int32 type = 3; + repeated Param params = 4; //each device has some number of params +} + +message DevData { + repeated Device devices = 1; //this single field has information about all requested params of devices +} diff --git a/protos/input.proto b/protos/input.proto new file mode 100644 index 00000000..7218801c --- /dev/null +++ b/protos/input.proto @@ -0,0 +1,26 @@ +/* + * Defines a message for communicating user inputs + */ + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +// Message for the current state of an input +message Input { + bool connected = 1; + fixed64 buttons = 2; + repeated float axes = 3; + Source source = 4; +} + +// An array of all inputs from all sources +message UserInputs { + repeated Input inputs = 1; +} + +// Enum specifying which input source the data is from +enum Source { + GAMEPAD = 0; + KEYBOARD = 1; +} diff --git a/protos/protos.d.ts b/protos/protos.d.ts new file mode 100644 index 00000000..4c88a214 --- /dev/null +++ b/protos/protos.d.ts @@ -0,0 +1,894 @@ +import * as $protobuf from "protobufjs"; +/** Properties of a Param. */ +export interface IParam { + + /** Param name */ + name?: (string|null); + + /** Param fval */ + fval?: (number|null); + + /** Param ival */ + ival?: (number|null); + + /** Param bval */ + bval?: (boolean|null); +} + +/** Represents a Param. */ +export class Param implements IParam { + + /** + * Constructs a new Param. + * @param [properties] Properties to set + */ + constructor(properties?: IParam); + + /** Param name. */ + public name: string; + + /** Param fval. */ + public fval: number; + + /** Param ival. */ + public ival: number; + + /** Param bval. */ + public bval: boolean; + + /** Param val. */ + public val?: ("fval"|"ival"|"bval"); + + /** + * Creates a new Param instance using the specified properties. + * @param [properties] Properties to set + * @returns Param instance + */ + public static create(properties?: IParam): Param; + + /** + * Encodes the specified Param message. Does not implicitly {@link Param.verify|verify} messages. + * @param message Param message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IParam, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Param message, length delimited. Does not implicitly {@link Param.verify|verify} messages. + * @param message Param message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IParam, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Param message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Param + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Param; + + /** + * Decodes a Param message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Param + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): Param; + + /** + * Verifies a Param message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Param message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Param + */ + public static fromObject(object: { [k: string]: any }): Param; + + /** + * Creates a plain object from a Param message. Also converts values to other types if specified. + * @param message Param + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: Param, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Param to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Properties of a Device. */ +export interface IDevice { + + /** Device name */ + name?: (string|null); + + /** Device uid */ + uid?: (number|Long|null); + + /** Device type */ + type?: (number|null); + + /** Device params */ + params?: (IParam[]|null); +} + +/** Represents a Device. */ +export class Device implements IDevice { + + /** + * Constructs a new Device. + * @param [properties] Properties to set + */ + constructor(properties?: IDevice); + + /** Device name. */ + public name: string; + + /** Device uid. */ + public uid: (number|Long); + + /** Device type. */ + public type: number; + + /** Device params. */ + public params: Param[]; + + /** + * Creates a new Device instance using the specified properties. + * @param [properties] Properties to set + * @returns Device instance + */ + public static create(properties?: IDevice): Device; + + /** + * Encodes the specified Device message. Does not implicitly {@link Device.verify|verify} messages. + * @param message Device message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IDevice, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Device message, length delimited. Does not implicitly {@link Device.verify|verify} messages. + * @param message Device message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IDevice, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Device message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Device + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Device; + + /** + * Decodes a Device message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Device + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): Device; + + /** + * Verifies a Device message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Device message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Device + */ + public static fromObject(object: { [k: string]: any }): Device; + + /** + * Creates a plain object from a Device message. Also converts values to other types if specified. + * @param message Device + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: Device, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Device to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Properties of a DevData. */ +export interface IDevData { + + /** DevData devices */ + devices?: (IDevice[]|null); +} + +/** Represents a DevData. */ +export class DevData implements IDevData { + + /** + * Constructs a new DevData. + * @param [properties] Properties to set + */ + constructor(properties?: IDevData); + + /** DevData devices. */ + public devices: Device[]; + + /** + * Creates a new DevData instance using the specified properties. + * @param [properties] Properties to set + * @returns DevData instance + */ + public static create(properties?: IDevData): DevData; + + /** + * Encodes the specified DevData message. Does not implicitly {@link DevData.verify|verify} messages. + * @param message DevData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IDevData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified DevData message, length delimited. Does not implicitly {@link DevData.verify|verify} messages. + * @param message DevData message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IDevData, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a DevData message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns DevData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): DevData; + + /** + * Decodes a DevData message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns DevData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): DevData; + + /** + * Verifies a DevData message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a DevData message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns DevData + */ + public static fromObject(object: { [k: string]: any }): DevData; + + /** + * Creates a plain object from a DevData message. Also converts values to other types if specified. + * @param message DevData + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: DevData, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this DevData to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Properties of an Input. */ +export interface IInput { + + /** Input connected */ + connected?: (boolean|null); + + /** Input buttons */ + buttons?: (number|Long|null); + + /** Input axes */ + axes?: (number[]|null); + + /** Input source */ + source?: (Source|null); +} + +/** Represents an Input. */ +export class Input implements IInput { + + /** + * Constructs a new Input. + * @param [properties] Properties to set + */ + constructor(properties?: IInput); + + /** Input connected. */ + public connected: boolean; + + /** Input buttons. */ + public buttons: (number|Long); + + /** Input axes. */ + public axes: number[]; + + /** Input source. */ + public source: Source; + + /** + * Creates a new Input instance using the specified properties. + * @param [properties] Properties to set + * @returns Input instance + */ + public static create(properties?: IInput): Input; + + /** + * Encodes the specified Input message. Does not implicitly {@link Input.verify|verify} messages. + * @param message Input message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IInput, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Input message, length delimited. Does not implicitly {@link Input.verify|verify} messages. + * @param message Input message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IInput, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes an Input message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Input + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Input; + + /** + * Decodes an Input message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Input + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): Input; + + /** + * Verifies an Input message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates an Input message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Input + */ + public static fromObject(object: { [k: string]: any }): Input; + + /** + * Creates a plain object from an Input message. Also converts values to other types if specified. + * @param message Input + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: Input, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Input to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Properties of a UserInputs. */ +export interface IUserInputs { + + /** UserInputs inputs */ + inputs?: (IInput[]|null); +} + +/** Represents a UserInputs. */ +export class UserInputs implements IUserInputs { + + /** + * Constructs a new UserInputs. + * @param [properties] Properties to set + */ + constructor(properties?: IUserInputs); + + /** UserInputs inputs. */ + public inputs: Input[]; + + /** + * Creates a new UserInputs instance using the specified properties. + * @param [properties] Properties to set + * @returns UserInputs instance + */ + public static create(properties?: IUserInputs): UserInputs; + + /** + * Encodes the specified UserInputs message. Does not implicitly {@link UserInputs.verify|verify} messages. + * @param message UserInputs message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IUserInputs, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified UserInputs message, length delimited. Does not implicitly {@link UserInputs.verify|verify} messages. + * @param message UserInputs message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IUserInputs, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a UserInputs message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns UserInputs + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): UserInputs; + + /** + * Decodes a UserInputs message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns UserInputs + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): UserInputs; + + /** + * Verifies a UserInputs message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a UserInputs message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns UserInputs + */ + public static fromObject(object: { [k: string]: any }): UserInputs; + + /** + * Creates a plain object from a UserInputs message. Also converts values to other types if specified. + * @param message UserInputs + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: UserInputs, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this UserInputs to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Source enum. */ +export enum Source { + GAMEPAD = 0, + KEYBOARD = 1 +} + +/** Mode enum. */ +export enum Mode { + IDLE = 0, + AUTO = 1, + TELEOP = 2, + ESTOP = 3, + CHALLENGE = 4 +} + +/** Properties of a RunMode. */ +export interface IRunMode { + + /** RunMode mode */ + mode?: (Mode|null); +} + +/** Represents a RunMode. */ +export class RunMode implements IRunMode { + + /** + * Constructs a new RunMode. + * @param [properties] Properties to set + */ + constructor(properties?: IRunMode); + + /** RunMode mode. */ + public mode: Mode; + + /** + * Creates a new RunMode instance using the specified properties. + * @param [properties] Properties to set + * @returns RunMode instance + */ + public static create(properties?: IRunMode): RunMode; + + /** + * Encodes the specified RunMode message. Does not implicitly {@link RunMode.verify|verify} messages. + * @param message RunMode message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IRunMode, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified RunMode message, length delimited. Does not implicitly {@link RunMode.verify|verify} messages. + * @param message RunMode message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IRunMode, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a RunMode message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns RunMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): RunMode; + + /** + * Decodes a RunMode message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns RunMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): RunMode; + + /** + * Verifies a RunMode message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a RunMode message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns RunMode + */ + public static fromObject(object: { [k: string]: any }): RunMode; + + /** + * Creates a plain object from a RunMode message. Also converts values to other types if specified. + * @param message RunMode + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: RunMode, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this RunMode to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Pos enum. */ +export enum Pos { + LEFT = 0, + RIGHT = 1 +} + +/** Properties of a StartPos. */ +export interface IStartPos { + + /** StartPos pos */ + pos?: (Pos|null); +} + +/** Represents a StartPos. */ +export class StartPos implements IStartPos { + + /** + * Constructs a new StartPos. + * @param [properties] Properties to set + */ + constructor(properties?: IStartPos); + + /** StartPos pos. */ + public pos: Pos; + + /** + * Creates a new StartPos instance using the specified properties. + * @param [properties] Properties to set + * @returns StartPos instance + */ + public static create(properties?: IStartPos): StartPos; + + /** + * Encodes the specified StartPos message. Does not implicitly {@link StartPos.verify|verify} messages. + * @param message StartPos message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IStartPos, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified StartPos message, length delimited. Does not implicitly {@link StartPos.verify|verify} messages. + * @param message StartPos message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IStartPos, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a StartPos message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns StartPos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): StartPos; + + /** + * Decodes a StartPos message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns StartPos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): StartPos; + + /** + * Verifies a StartPos message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a StartPos message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns StartPos + */ + public static fromObject(object: { [k: string]: any }): StartPos; + + /** + * Creates a plain object from a StartPos message. Also converts values to other types if specified. + * @param message StartPos + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: StartPos, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this StartPos to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Properties of a Text. */ +export interface IText { + + /** Text payload */ + payload?: (string[]|null); +} + +/** Represents a Text. */ +export class Text implements IText { + + /** + * Constructs a new Text. + * @param [properties] Properties to set + */ + constructor(properties?: IText); + + /** Text payload. */ + public payload: string[]; + + /** + * Creates a new Text instance using the specified properties. + * @param [properties] Properties to set + * @returns Text instance + */ + public static create(properties?: IText): Text; + + /** + * Encodes the specified Text message. Does not implicitly {@link Text.verify|verify} messages. + * @param message Text message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: IText, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified Text message, length delimited. Does not implicitly {@link Text.verify|verify} messages. + * @param message Text message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: IText, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a Text message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns Text + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): Text; + + /** + * Decodes a Text message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns Text + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): Text; + + /** + * Verifies a Text message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a Text message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns Text + */ + public static fromObject(object: { [k: string]: any }): Text; + + /** + * Creates a plain object from a Text message. Also converts values to other types if specified. + * @param message Text + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: Text, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this Text to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} + +/** Properties of a TimeStamps. */ +export interface ITimeStamps { + + /** TimeStamps dawnTimestamp */ + dawnTimestamp?: (number|Long|null); + + /** TimeStamps runtimeTimestamp */ + runtimeTimestamp?: (number|Long|null); +} + +/** Represents a TimeStamps. */ +export class TimeStamps implements ITimeStamps { + + /** + * Constructs a new TimeStamps. + * @param [properties] Properties to set + */ + constructor(properties?: ITimeStamps); + + /** TimeStamps dawnTimestamp. */ + public dawnTimestamp: (number|Long); + + /** TimeStamps runtimeTimestamp. */ + public runtimeTimestamp: (number|Long); + + /** + * Creates a new TimeStamps instance using the specified properties. + * @param [properties] Properties to set + * @returns TimeStamps instance + */ + public static create(properties?: ITimeStamps): TimeStamps; + + /** + * Encodes the specified TimeStamps message. Does not implicitly {@link TimeStamps.verify|verify} messages. + * @param message TimeStamps message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encode(message: ITimeStamps, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link TimeStamps.verify|verify} messages. + * @param message TimeStamps message or plain object to encode + * @param [writer] Writer to encode to + * @returns Writer + */ + public static encodeDelimited(message: ITimeStamps, writer?: $protobuf.Writer): $protobuf.Writer; + + /** + * Decodes a TimeStamps message from the specified reader or buffer. + * @param reader Reader or buffer to decode from + * @param [length] Message length if known beforehand + * @returns TimeStamps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decode(reader: ($protobuf.Reader|Uint8Array), length?: number): TimeStamps; + + /** + * Decodes a TimeStamps message from the specified reader or buffer, length delimited. + * @param reader Reader or buffer to decode from + * @returns TimeStamps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + public static decodeDelimited(reader: ($protobuf.Reader|Uint8Array)): TimeStamps; + + /** + * Verifies a TimeStamps message. + * @param message Plain object to verify + * @returns `null` if valid, otherwise the reason why it is not + */ + public static verify(message: { [k: string]: any }): (string|null); + + /** + * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types. + * @param object Plain object + * @returns TimeStamps + */ + public static fromObject(object: { [k: string]: any }): TimeStamps; + + /** + * Creates a plain object from a TimeStamps message. Also converts values to other types if specified. + * @param message TimeStamps + * @param [options] Conversion options + * @returns Plain object + */ + public static toObject(message: TimeStamps, options?: $protobuf.IConversionOptions): { [k: string]: any }; + + /** + * Converts this TimeStamps to JSON. + * @returns JSON object + */ + public toJSON(): { [k: string]: any }; +} diff --git a/protos/protos.js b/protos/protos.js new file mode 100644 index 00000000..7d097151 --- /dev/null +++ b/protos/protos.js @@ -0,0 +1,2210 @@ +/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ +import * as $protobuf from "protobufjs/minimal"; + +// Common aliases +const $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util; + +// Exported root namespace +const $root = $protobuf.roots["default"] || ($protobuf.roots["default"] = {}); + +export const Param = $root.Param = (() => { + + /** + * Properties of a Param. + * @exports IParam + * @interface IParam + * @property {string|null} [name] Param name + * @property {number|null} [fval] Param fval + * @property {number|null} [ival] Param ival + * @property {boolean|null} [bval] Param bval + */ + + /** + * Constructs a new Param. + * @exports Param + * @classdesc Represents a Param. + * @implements IParam + * @constructor + * @param {IParam=} [properties] Properties to set + */ + function Param(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Param name. + * @member {string} name + * @memberof Param + * @instance + */ + Param.prototype.name = ""; + + /** + * Param fval. + * @member {number} fval + * @memberof Param + * @instance + */ + Param.prototype.fval = 0; + + /** + * Param ival. + * @member {number} ival + * @memberof Param + * @instance + */ + Param.prototype.ival = 0; + + /** + * Param bval. + * @member {boolean} bval + * @memberof Param + * @instance + */ + Param.prototype.bval = false; + + // OneOf field names bound to virtual getters and setters + let $oneOfFields; + + /** + * Param val. + * @member {"fval"|"ival"|"bval"|undefined} val + * @memberof Param + * @instance + */ + Object.defineProperty(Param.prototype, "val", { + get: $util.oneOfGetter($oneOfFields = ["fval", "ival", "bval"]), + set: $util.oneOfSetter($oneOfFields) + }); + + /** + * Creates a new Param instance using the specified properties. + * @function create + * @memberof Param + * @static + * @param {IParam=} [properties] Properties to set + * @returns {Param} Param instance + */ + Param.create = function create(properties) { + return new Param(properties); + }; + + /** + * Encodes the specified Param message. Does not implicitly {@link Param.verify|verify} messages. + * @function encode + * @memberof Param + * @static + * @param {IParam} message Param message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Param.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.fval != null && Object.hasOwnProperty.call(message, "fval")) + writer.uint32(/* id 2, wireType 5 =*/21).float(message.fval); + if (message.ival != null && Object.hasOwnProperty.call(message, "ival")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.ival); + if (message.bval != null && Object.hasOwnProperty.call(message, "bval")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.bval); + return writer; + }; + + /** + * Encodes the specified Param message, length delimited. Does not implicitly {@link Param.verify|verify} messages. + * @function encodeDelimited + * @memberof Param + * @static + * @param {IParam} message Param message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Param.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Param message from the specified reader or buffer. + * @function decode + * @memberof Param + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Param} Param + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Param.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Param(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.fval = reader.float(); + break; + case 3: + message.ival = reader.int32(); + break; + case 4: + message.bval = reader.bool(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Param message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof Param + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {Param} Param + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Param.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Param message. + * @function verify + * @memberof Param + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Param.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + let properties = {}; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.fval != null && message.hasOwnProperty("fval")) { + properties.val = 1; + if (typeof message.fval !== "number") + return "fval: number expected"; + } + if (message.ival != null && message.hasOwnProperty("ival")) { + if (properties.val === 1) + return "val: multiple values"; + properties.val = 1; + if (!$util.isInteger(message.ival)) + return "ival: integer expected"; + } + if (message.bval != null && message.hasOwnProperty("bval")) { + if (properties.val === 1) + return "val: multiple values"; + properties.val = 1; + if (typeof message.bval !== "boolean") + return "bval: boolean expected"; + } + return null; + }; + + /** + * Creates a Param message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof Param + * @static + * @param {Object.} object Plain object + * @returns {Param} Param + */ + Param.fromObject = function fromObject(object) { + if (object instanceof $root.Param) + return object; + let message = new $root.Param(); + if (object.name != null) + message.name = String(object.name); + if (object.fval != null) + message.fval = Number(object.fval); + if (object.ival != null) + message.ival = object.ival | 0; + if (object.bval != null) + message.bval = Boolean(object.bval); + return message; + }; + + /** + * Creates a plain object from a Param message. Also converts values to other types if specified. + * @function toObject + * @memberof Param + * @static + * @param {Param} message Param + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Param.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.name = ""; + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.fval != null && message.hasOwnProperty("fval")) { + object.fval = options.json && !isFinite(message.fval) ? String(message.fval) : message.fval; + if (options.oneofs) + object.val = "fval"; + } + if (message.ival != null && message.hasOwnProperty("ival")) { + object.ival = message.ival; + if (options.oneofs) + object.val = "ival"; + } + if (message.bval != null && message.hasOwnProperty("bval")) { + object.bval = message.bval; + if (options.oneofs) + object.val = "bval"; + } + return object; + }; + + /** + * Converts this Param to JSON. + * @function toJSON + * @memberof Param + * @instance + * @returns {Object.} JSON object + */ + Param.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Param; +})(); + +export const Device = $root.Device = (() => { + + /** + * Properties of a Device. + * @exports IDevice + * @interface IDevice + * @property {string|null} [name] Device name + * @property {number|Long|null} [uid] Device uid + * @property {number|null} [type] Device type + * @property {Array.|null} [params] Device params + */ + + /** + * Constructs a new Device. + * @exports Device + * @classdesc Represents a Device. + * @implements IDevice + * @constructor + * @param {IDevice=} [properties] Properties to set + */ + function Device(properties) { + this.params = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Device name. + * @member {string} name + * @memberof Device + * @instance + */ + Device.prototype.name = ""; + + /** + * Device uid. + * @member {number|Long} uid + * @memberof Device + * @instance + */ + Device.prototype.uid = $util.Long ? $util.Long.fromBits(0,0,true) : 0; + + /** + * Device type. + * @member {number} type + * @memberof Device + * @instance + */ + Device.prototype.type = 0; + + /** + * Device params. + * @member {Array.} params + * @memberof Device + * @instance + */ + Device.prototype.params = $util.emptyArray; + + /** + * Creates a new Device instance using the specified properties. + * @function create + * @memberof Device + * @static + * @param {IDevice=} [properties] Properties to set + * @returns {Device} Device instance + */ + Device.create = function create(properties) { + return new Device(properties); + }; + + /** + * Encodes the specified Device message. Does not implicitly {@link Device.verify|verify} messages. + * @function encode + * @memberof Device + * @static + * @param {IDevice} message Device message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Device.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.name != null && Object.hasOwnProperty.call(message, "name")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.name); + if (message.uid != null && Object.hasOwnProperty.call(message, "uid")) + writer.uint32(/* id 2, wireType 0 =*/16).uint64(message.uid); + if (message.type != null && Object.hasOwnProperty.call(message, "type")) + writer.uint32(/* id 3, wireType 0 =*/24).int32(message.type); + if (message.params != null && message.params.length) + for (let i = 0; i < message.params.length; ++i) + $root.Param.encode(message.params[i], writer.uint32(/* id 4, wireType 2 =*/34).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified Device message, length delimited. Does not implicitly {@link Device.verify|verify} messages. + * @function encodeDelimited + * @memberof Device + * @static + * @param {IDevice} message Device message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Device.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Device message from the specified reader or buffer. + * @function decode + * @memberof Device + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Device} Device + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Device.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Device(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.name = reader.string(); + break; + case 2: + message.uid = reader.uint64(); + break; + case 3: + message.type = reader.int32(); + break; + case 4: + if (!(message.params && message.params.length)) + message.params = []; + message.params.push($root.Param.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Device message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof Device + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {Device} Device + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Device.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Device message. + * @function verify + * @memberof Device + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Device.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.name != null && message.hasOwnProperty("name")) + if (!$util.isString(message.name)) + return "name: string expected"; + if (message.uid != null && message.hasOwnProperty("uid")) + if (!$util.isInteger(message.uid) && !(message.uid && $util.isInteger(message.uid.low) && $util.isInteger(message.uid.high))) + return "uid: integer|Long expected"; + if (message.type != null && message.hasOwnProperty("type")) + if (!$util.isInteger(message.type)) + return "type: integer expected"; + if (message.params != null && message.hasOwnProperty("params")) { + if (!Array.isArray(message.params)) + return "params: array expected"; + for (let i = 0; i < message.params.length; ++i) { + let error = $root.Param.verify(message.params[i]); + if (error) + return "params." + error; + } + } + return null; + }; + + /** + * Creates a Device message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof Device + * @static + * @param {Object.} object Plain object + * @returns {Device} Device + */ + Device.fromObject = function fromObject(object) { + if (object instanceof $root.Device) + return object; + let message = new $root.Device(); + if (object.name != null) + message.name = String(object.name); + if (object.uid != null) + if ($util.Long) + (message.uid = $util.Long.fromValue(object.uid)).unsigned = true; + else if (typeof object.uid === "string") + message.uid = parseInt(object.uid, 10); + else if (typeof object.uid === "number") + message.uid = object.uid; + else if (typeof object.uid === "object") + message.uid = new $util.LongBits(object.uid.low >>> 0, object.uid.high >>> 0).toNumber(true); + if (object.type != null) + message.type = object.type | 0; + if (object.params) { + if (!Array.isArray(object.params)) + throw TypeError(".Device.params: array expected"); + message.params = []; + for (let i = 0; i < object.params.length; ++i) { + if (typeof object.params[i] !== "object") + throw TypeError(".Device.params: object expected"); + message.params[i] = $root.Param.fromObject(object.params[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a Device message. Also converts values to other types if specified. + * @function toObject + * @memberof Device + * @static + * @param {Device} message Device + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Device.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.params = []; + if (options.defaults) { + object.name = ""; + if ($util.Long) { + let long = new $util.Long(0, 0, true); + object.uid = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.uid = options.longs === String ? "0" : 0; + object.type = 0; + } + if (message.name != null && message.hasOwnProperty("name")) + object.name = message.name; + if (message.uid != null && message.hasOwnProperty("uid")) + if (typeof message.uid === "number") + object.uid = options.longs === String ? String(message.uid) : message.uid; + else + object.uid = options.longs === String ? $util.Long.prototype.toString.call(message.uid) : options.longs === Number ? new $util.LongBits(message.uid.low >>> 0, message.uid.high >>> 0).toNumber(true) : message.uid; + if (message.type != null && message.hasOwnProperty("type")) + object.type = message.type; + if (message.params && message.params.length) { + object.params = []; + for (let j = 0; j < message.params.length; ++j) + object.params[j] = $root.Param.toObject(message.params[j], options); + } + return object; + }; + + /** + * Converts this Device to JSON. + * @function toJSON + * @memberof Device + * @instance + * @returns {Object.} JSON object + */ + Device.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Device; +})(); + +export const DevData = $root.DevData = (() => { + + /** + * Properties of a DevData. + * @exports IDevData + * @interface IDevData + * @property {Array.|null} [devices] DevData devices + */ + + /** + * Constructs a new DevData. + * @exports DevData + * @classdesc Represents a DevData. + * @implements IDevData + * @constructor + * @param {IDevData=} [properties] Properties to set + */ + function DevData(properties) { + this.devices = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * DevData devices. + * @member {Array.} devices + * @memberof DevData + * @instance + */ + DevData.prototype.devices = $util.emptyArray; + + /** + * Creates a new DevData instance using the specified properties. + * @function create + * @memberof DevData + * @static + * @param {IDevData=} [properties] Properties to set + * @returns {DevData} DevData instance + */ + DevData.create = function create(properties) { + return new DevData(properties); + }; + + /** + * Encodes the specified DevData message. Does not implicitly {@link DevData.verify|verify} messages. + * @function encode + * @memberof DevData + * @static + * @param {IDevData} message DevData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DevData.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.devices != null && message.devices.length) + for (let i = 0; i < message.devices.length; ++i) + $root.Device.encode(message.devices[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified DevData message, length delimited. Does not implicitly {@link DevData.verify|verify} messages. + * @function encodeDelimited + * @memberof DevData + * @static + * @param {IDevData} message DevData message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + DevData.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a DevData message from the specified reader or buffer. + * @function decode + * @memberof DevData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {DevData} DevData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DevData.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.DevData(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.devices && message.devices.length)) + message.devices = []; + message.devices.push($root.Device.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a DevData message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof DevData + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {DevData} DevData + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + DevData.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a DevData message. + * @function verify + * @memberof DevData + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + DevData.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.devices != null && message.hasOwnProperty("devices")) { + if (!Array.isArray(message.devices)) + return "devices: array expected"; + for (let i = 0; i < message.devices.length; ++i) { + let error = $root.Device.verify(message.devices[i]); + if (error) + return "devices." + error; + } + } + return null; + }; + + /** + * Creates a DevData message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof DevData + * @static + * @param {Object.} object Plain object + * @returns {DevData} DevData + */ + DevData.fromObject = function fromObject(object) { + if (object instanceof $root.DevData) + return object; + let message = new $root.DevData(); + if (object.devices) { + if (!Array.isArray(object.devices)) + throw TypeError(".DevData.devices: array expected"); + message.devices = []; + for (let i = 0; i < object.devices.length; ++i) { + if (typeof object.devices[i] !== "object") + throw TypeError(".DevData.devices: object expected"); + message.devices[i] = $root.Device.fromObject(object.devices[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a DevData message. Also converts values to other types if specified. + * @function toObject + * @memberof DevData + * @static + * @param {DevData} message DevData + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + DevData.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.devices = []; + if (message.devices && message.devices.length) { + object.devices = []; + for (let j = 0; j < message.devices.length; ++j) + object.devices[j] = $root.Device.toObject(message.devices[j], options); + } + return object; + }; + + /** + * Converts this DevData to JSON. + * @function toJSON + * @memberof DevData + * @instance + * @returns {Object.} JSON object + */ + DevData.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return DevData; +})(); + +export const Input = $root.Input = (() => { + + /** + * Properties of an Input. + * @exports IInput + * @interface IInput + * @property {boolean|null} [connected] Input connected + * @property {number|Long|null} [buttons] Input buttons + * @property {Array.|null} [axes] Input axes + * @property {Source|null} [source] Input source + */ + + /** + * Constructs a new Input. + * @exports Input + * @classdesc Represents an Input. + * @implements IInput + * @constructor + * @param {IInput=} [properties] Properties to set + */ + function Input(properties) { + this.axes = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Input connected. + * @member {boolean} connected + * @memberof Input + * @instance + */ + Input.prototype.connected = false; + + /** + * Input buttons. + * @member {number|Long} buttons + * @memberof Input + * @instance + */ + Input.prototype.buttons = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Input axes. + * @member {Array.} axes + * @memberof Input + * @instance + */ + Input.prototype.axes = $util.emptyArray; + + /** + * Input source. + * @member {Source} source + * @memberof Input + * @instance + */ + Input.prototype.source = 0; + + /** + * Creates a new Input instance using the specified properties. + * @function create + * @memberof Input + * @static + * @param {IInput=} [properties] Properties to set + * @returns {Input} Input instance + */ + Input.create = function create(properties) { + return new Input(properties); + }; + + /** + * Encodes the specified Input message. Does not implicitly {@link Input.verify|verify} messages. + * @function encode + * @memberof Input + * @static + * @param {IInput} message Input message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Input.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.connected != null && Object.hasOwnProperty.call(message, "connected")) + writer.uint32(/* id 1, wireType 0 =*/8).bool(message.connected); + if (message.buttons != null && Object.hasOwnProperty.call(message, "buttons")) + writer.uint32(/* id 2, wireType 1 =*/17).fixed64(message.buttons); + if (message.axes != null && message.axes.length) { + writer.uint32(/* id 3, wireType 2 =*/26).fork(); + for (let i = 0; i < message.axes.length; ++i) + writer.float(message.axes[i]); + writer.ldelim(); + } + if (message.source != null && Object.hasOwnProperty.call(message, "source")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.source); + return writer; + }; + + /** + * Encodes the specified Input message, length delimited. Does not implicitly {@link Input.verify|verify} messages. + * @function encodeDelimited + * @memberof Input + * @static + * @param {IInput} message Input message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Input.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes an Input message from the specified reader or buffer. + * @function decode + * @memberof Input + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Input} Input + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Input.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Input(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.connected = reader.bool(); + break; + case 2: + message.buttons = reader.fixed64(); + break; + case 3: + if (!(message.axes && message.axes.length)) + message.axes = []; + if ((tag & 7) === 2) { + let end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) + message.axes.push(reader.float()); + } else + message.axes.push(reader.float()); + break; + case 4: + message.source = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes an Input message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof Input + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {Input} Input + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Input.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies an Input message. + * @function verify + * @memberof Input + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Input.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.connected != null && message.hasOwnProperty("connected")) + if (typeof message.connected !== "boolean") + return "connected: boolean expected"; + if (message.buttons != null && message.hasOwnProperty("buttons")) + if (!$util.isInteger(message.buttons) && !(message.buttons && $util.isInteger(message.buttons.low) && $util.isInteger(message.buttons.high))) + return "buttons: integer|Long expected"; + if (message.axes != null && message.hasOwnProperty("axes")) { + if (!Array.isArray(message.axes)) + return "axes: array expected"; + for (let i = 0; i < message.axes.length; ++i) + if (typeof message.axes[i] !== "number") + return "axes: number[] expected"; + } + if (message.source != null && message.hasOwnProperty("source")) + switch (message.source) { + default: + return "source: enum value expected"; + case 0: + case 1: + break; + } + return null; + }; + + /** + * Creates an Input message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof Input + * @static + * @param {Object.} object Plain object + * @returns {Input} Input + */ + Input.fromObject = function fromObject(object) { + if (object instanceof $root.Input) + return object; + let message = new $root.Input(); + if (object.connected != null) + message.connected = Boolean(object.connected); + if (object.buttons != null) + if ($util.Long) + (message.buttons = $util.Long.fromValue(object.buttons)).unsigned = false; + else if (typeof object.buttons === "string") + message.buttons = parseInt(object.buttons, 10); + else if (typeof object.buttons === "number") + message.buttons = object.buttons; + else if (typeof object.buttons === "object") + message.buttons = new $util.LongBits(object.buttons.low >>> 0, object.buttons.high >>> 0).toNumber(); + if (object.axes) { + if (!Array.isArray(object.axes)) + throw TypeError(".Input.axes: array expected"); + message.axes = []; + for (let i = 0; i < object.axes.length; ++i) + message.axes[i] = Number(object.axes[i]); + } + switch (object.source) { + case "GAMEPAD": + case 0: + message.source = 0; + break; + case "KEYBOARD": + case 1: + message.source = 1; + break; + } + return message; + }; + + /** + * Creates a plain object from an Input message. Also converts values to other types if specified. + * @function toObject + * @memberof Input + * @static + * @param {Input} message Input + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Input.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.axes = []; + if (options.defaults) { + object.connected = false; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.buttons = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.buttons = options.longs === String ? "0" : 0; + object.source = options.enums === String ? "GAMEPAD" : 0; + } + if (message.connected != null && message.hasOwnProperty("connected")) + object.connected = message.connected; + if (message.buttons != null && message.hasOwnProperty("buttons")) + if (typeof message.buttons === "number") + object.buttons = options.longs === String ? String(message.buttons) : message.buttons; + else + object.buttons = options.longs === String ? $util.Long.prototype.toString.call(message.buttons) : options.longs === Number ? new $util.LongBits(message.buttons.low >>> 0, message.buttons.high >>> 0).toNumber() : message.buttons; + if (message.axes && message.axes.length) { + object.axes = []; + for (let j = 0; j < message.axes.length; ++j) + object.axes[j] = options.json && !isFinite(message.axes[j]) ? String(message.axes[j]) : message.axes[j]; + } + if (message.source != null && message.hasOwnProperty("source")) + object.source = options.enums === String ? $root.Source[message.source] : message.source; + return object; + }; + + /** + * Converts this Input to JSON. + * @function toJSON + * @memberof Input + * @instance + * @returns {Object.} JSON object + */ + Input.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Input; +})(); + +export const UserInputs = $root.UserInputs = (() => { + + /** + * Properties of a UserInputs. + * @exports IUserInputs + * @interface IUserInputs + * @property {Array.|null} [inputs] UserInputs inputs + */ + + /** + * Constructs a new UserInputs. + * @exports UserInputs + * @classdesc Represents a UserInputs. + * @implements IUserInputs + * @constructor + * @param {IUserInputs=} [properties] Properties to set + */ + function UserInputs(properties) { + this.inputs = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * UserInputs inputs. + * @member {Array.} inputs + * @memberof UserInputs + * @instance + */ + UserInputs.prototype.inputs = $util.emptyArray; + + /** + * Creates a new UserInputs instance using the specified properties. + * @function create + * @memberof UserInputs + * @static + * @param {IUserInputs=} [properties] Properties to set + * @returns {UserInputs} UserInputs instance + */ + UserInputs.create = function create(properties) { + return new UserInputs(properties); + }; + + /** + * Encodes the specified UserInputs message. Does not implicitly {@link UserInputs.verify|verify} messages. + * @function encode + * @memberof UserInputs + * @static + * @param {IUserInputs} message UserInputs message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserInputs.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.inputs != null && message.inputs.length) + for (let i = 0; i < message.inputs.length; ++i) + $root.Input.encode(message.inputs[i], writer.uint32(/* id 1, wireType 2 =*/10).fork()).ldelim(); + return writer; + }; + + /** + * Encodes the specified UserInputs message, length delimited. Does not implicitly {@link UserInputs.verify|verify} messages. + * @function encodeDelimited + * @memberof UserInputs + * @static + * @param {IUserInputs} message UserInputs message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + UserInputs.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a UserInputs message from the specified reader or buffer. + * @function decode + * @memberof UserInputs + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {UserInputs} UserInputs + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserInputs.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.UserInputs(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.inputs && message.inputs.length)) + message.inputs = []; + message.inputs.push($root.Input.decode(reader, reader.uint32())); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a UserInputs message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof UserInputs + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {UserInputs} UserInputs + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + UserInputs.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a UserInputs message. + * @function verify + * @memberof UserInputs + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + UserInputs.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.inputs != null && message.hasOwnProperty("inputs")) { + if (!Array.isArray(message.inputs)) + return "inputs: array expected"; + for (let i = 0; i < message.inputs.length; ++i) { + let error = $root.Input.verify(message.inputs[i]); + if (error) + return "inputs." + error; + } + } + return null; + }; + + /** + * Creates a UserInputs message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof UserInputs + * @static + * @param {Object.} object Plain object + * @returns {UserInputs} UserInputs + */ + UserInputs.fromObject = function fromObject(object) { + if (object instanceof $root.UserInputs) + return object; + let message = new $root.UserInputs(); + if (object.inputs) { + if (!Array.isArray(object.inputs)) + throw TypeError(".UserInputs.inputs: array expected"); + message.inputs = []; + for (let i = 0; i < object.inputs.length; ++i) { + if (typeof object.inputs[i] !== "object") + throw TypeError(".UserInputs.inputs: object expected"); + message.inputs[i] = $root.Input.fromObject(object.inputs[i]); + } + } + return message; + }; + + /** + * Creates a plain object from a UserInputs message. Also converts values to other types if specified. + * @function toObject + * @memberof UserInputs + * @static + * @param {UserInputs} message UserInputs + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + UserInputs.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.inputs = []; + if (message.inputs && message.inputs.length) { + object.inputs = []; + for (let j = 0; j < message.inputs.length; ++j) + object.inputs[j] = $root.Input.toObject(message.inputs[j], options); + } + return object; + }; + + /** + * Converts this UserInputs to JSON. + * @function toJSON + * @memberof UserInputs + * @instance + * @returns {Object.} JSON object + */ + UserInputs.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return UserInputs; +})(); + +/** + * Source enum. + * @exports Source + * @enum {number} + * @property {number} GAMEPAD=0 GAMEPAD value + * @property {number} KEYBOARD=1 KEYBOARD value + */ +export const Source = $root.Source = (() => { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "GAMEPAD"] = 0; + values[valuesById[1] = "KEYBOARD"] = 1; + return values; +})(); + +/** + * Mode enum. + * @exports Mode + * @enum {number} + * @property {number} IDLE=0 IDLE value + * @property {number} AUTO=1 AUTO value + * @property {number} TELEOP=2 TELEOP value + * @property {number} ESTOP=3 ESTOP value + * @property {number} CHALLENGE=4 CHALLENGE value + */ +export const Mode = $root.Mode = (() => { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "IDLE"] = 0; + values[valuesById[1] = "AUTO"] = 1; + values[valuesById[2] = "TELEOP"] = 2; + values[valuesById[3] = "ESTOP"] = 3; + values[valuesById[4] = "CHALLENGE"] = 4; + return values; +})(); + +export const RunMode = $root.RunMode = (() => { + + /** + * Properties of a RunMode. + * @exports IRunMode + * @interface IRunMode + * @property {Mode|null} [mode] RunMode mode + */ + + /** + * Constructs a new RunMode. + * @exports RunMode + * @classdesc Represents a RunMode. + * @implements IRunMode + * @constructor + * @param {IRunMode=} [properties] Properties to set + */ + function RunMode(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * RunMode mode. + * @member {Mode} mode + * @memberof RunMode + * @instance + */ + RunMode.prototype.mode = 0; + + /** + * Creates a new RunMode instance using the specified properties. + * @function create + * @memberof RunMode + * @static + * @param {IRunMode=} [properties] Properties to set + * @returns {RunMode} RunMode instance + */ + RunMode.create = function create(properties) { + return new RunMode(properties); + }; + + /** + * Encodes the specified RunMode message. Does not implicitly {@link RunMode.verify|verify} messages. + * @function encode + * @memberof RunMode + * @static + * @param {IRunMode} message RunMode message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RunMode.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.mode != null && Object.hasOwnProperty.call(message, "mode")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.mode); + return writer; + }; + + /** + * Encodes the specified RunMode message, length delimited. Does not implicitly {@link RunMode.verify|verify} messages. + * @function encodeDelimited + * @memberof RunMode + * @static + * @param {IRunMode} message RunMode message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + RunMode.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a RunMode message from the specified reader or buffer. + * @function decode + * @memberof RunMode + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {RunMode} RunMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RunMode.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.RunMode(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.mode = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a RunMode message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof RunMode + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {RunMode} RunMode + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + RunMode.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a RunMode message. + * @function verify + * @memberof RunMode + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + RunMode.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.mode != null && message.hasOwnProperty("mode")) + switch (message.mode) { + default: + return "mode: enum value expected"; + case 0: + case 1: + case 2: + case 3: + case 4: + break; + } + return null; + }; + + /** + * Creates a RunMode message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof RunMode + * @static + * @param {Object.} object Plain object + * @returns {RunMode} RunMode + */ + RunMode.fromObject = function fromObject(object) { + if (object instanceof $root.RunMode) + return object; + let message = new $root.RunMode(); + switch (object.mode) { + case "IDLE": + case 0: + message.mode = 0; + break; + case "AUTO": + case 1: + message.mode = 1; + break; + case "TELEOP": + case 2: + message.mode = 2; + break; + case "ESTOP": + case 3: + message.mode = 3; + break; + case "CHALLENGE": + case 4: + message.mode = 4; + break; + } + return message; + }; + + /** + * Creates a plain object from a RunMode message. Also converts values to other types if specified. + * @function toObject + * @memberof RunMode + * @static + * @param {RunMode} message RunMode + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + RunMode.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.mode = options.enums === String ? "IDLE" : 0; + if (message.mode != null && message.hasOwnProperty("mode")) + object.mode = options.enums === String ? $root.Mode[message.mode] : message.mode; + return object; + }; + + /** + * Converts this RunMode to JSON. + * @function toJSON + * @memberof RunMode + * @instance + * @returns {Object.} JSON object + */ + RunMode.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return RunMode; +})(); + +/** + * Pos enum. + * @exports Pos + * @enum {number} + * @property {number} LEFT=0 LEFT value + * @property {number} RIGHT=1 RIGHT value + */ +export const Pos = $root.Pos = (() => { + const valuesById = {}, values = Object.create(valuesById); + values[valuesById[0] = "LEFT"] = 0; + values[valuesById[1] = "RIGHT"] = 1; + return values; +})(); + +export const StartPos = $root.StartPos = (() => { + + /** + * Properties of a StartPos. + * @exports IStartPos + * @interface IStartPos + * @property {Pos|null} [pos] StartPos pos + */ + + /** + * Constructs a new StartPos. + * @exports StartPos + * @classdesc Represents a StartPos. + * @implements IStartPos + * @constructor + * @param {IStartPos=} [properties] Properties to set + */ + function StartPos(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * StartPos pos. + * @member {Pos} pos + * @memberof StartPos + * @instance + */ + StartPos.prototype.pos = 0; + + /** + * Creates a new StartPos instance using the specified properties. + * @function create + * @memberof StartPos + * @static + * @param {IStartPos=} [properties] Properties to set + * @returns {StartPos} StartPos instance + */ + StartPos.create = function create(properties) { + return new StartPos(properties); + }; + + /** + * Encodes the specified StartPos message. Does not implicitly {@link StartPos.verify|verify} messages. + * @function encode + * @memberof StartPos + * @static + * @param {IStartPos} message StartPos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartPos.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.pos != null && Object.hasOwnProperty.call(message, "pos")) + writer.uint32(/* id 1, wireType 0 =*/8).int32(message.pos); + return writer; + }; + + /** + * Encodes the specified StartPos message, length delimited. Does not implicitly {@link StartPos.verify|verify} messages. + * @function encodeDelimited + * @memberof StartPos + * @static + * @param {IStartPos} message StartPos message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + StartPos.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a StartPos message from the specified reader or buffer. + * @function decode + * @memberof StartPos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {StartPos} StartPos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartPos.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.StartPos(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.pos = reader.int32(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a StartPos message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof StartPos + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {StartPos} StartPos + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + StartPos.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a StartPos message. + * @function verify + * @memberof StartPos + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + StartPos.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.pos != null && message.hasOwnProperty("pos")) + switch (message.pos) { + default: + return "pos: enum value expected"; + case 0: + case 1: + break; + } + return null; + }; + + /** + * Creates a StartPos message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof StartPos + * @static + * @param {Object.} object Plain object + * @returns {StartPos} StartPos + */ + StartPos.fromObject = function fromObject(object) { + if (object instanceof $root.StartPos) + return object; + let message = new $root.StartPos(); + switch (object.pos) { + case "LEFT": + case 0: + message.pos = 0; + break; + case "RIGHT": + case 1: + message.pos = 1; + break; + } + return message; + }; + + /** + * Creates a plain object from a StartPos message. Also converts values to other types if specified. + * @function toObject + * @memberof StartPos + * @static + * @param {StartPos} message StartPos + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + StartPos.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) + object.pos = options.enums === String ? "LEFT" : 0; + if (message.pos != null && message.hasOwnProperty("pos")) + object.pos = options.enums === String ? $root.Pos[message.pos] : message.pos; + return object; + }; + + /** + * Converts this StartPos to JSON. + * @function toJSON + * @memberof StartPos + * @instance + * @returns {Object.} JSON object + */ + StartPos.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return StartPos; +})(); + +export const Text = $root.Text = (() => { + + /** + * Properties of a Text. + * @exports IText + * @interface IText + * @property {Array.|null} [payload] Text payload + */ + + /** + * Constructs a new Text. + * @exports Text + * @classdesc Represents a Text. + * @implements IText + * @constructor + * @param {IText=} [properties] Properties to set + */ + function Text(properties) { + this.payload = []; + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * Text payload. + * @member {Array.} payload + * @memberof Text + * @instance + */ + Text.prototype.payload = $util.emptyArray; + + /** + * Creates a new Text instance using the specified properties. + * @function create + * @memberof Text + * @static + * @param {IText=} [properties] Properties to set + * @returns {Text} Text instance + */ + Text.create = function create(properties) { + return new Text(properties); + }; + + /** + * Encodes the specified Text message. Does not implicitly {@link Text.verify|verify} messages. + * @function encode + * @memberof Text + * @static + * @param {IText} message Text message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Text.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.payload != null && message.payload.length) + for (let i = 0; i < message.payload.length; ++i) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.payload[i]); + return writer; + }; + + /** + * Encodes the specified Text message, length delimited. Does not implicitly {@link Text.verify|verify} messages. + * @function encodeDelimited + * @memberof Text + * @static + * @param {IText} message Text message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + Text.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a Text message from the specified reader or buffer. + * @function decode + * @memberof Text + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {Text} Text + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Text.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.Text(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (!(message.payload && message.payload.length)) + message.payload = []; + message.payload.push(reader.string()); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a Text message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof Text + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {Text} Text + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + Text.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a Text message. + * @function verify + * @memberof Text + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + Text.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.payload != null && message.hasOwnProperty("payload")) { + if (!Array.isArray(message.payload)) + return "payload: array expected"; + for (let i = 0; i < message.payload.length; ++i) + if (!$util.isString(message.payload[i])) + return "payload: string[] expected"; + } + return null; + }; + + /** + * Creates a Text message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof Text + * @static + * @param {Object.} object Plain object + * @returns {Text} Text + */ + Text.fromObject = function fromObject(object) { + if (object instanceof $root.Text) + return object; + let message = new $root.Text(); + if (object.payload) { + if (!Array.isArray(object.payload)) + throw TypeError(".Text.payload: array expected"); + message.payload = []; + for (let i = 0; i < object.payload.length; ++i) + message.payload[i] = String(object.payload[i]); + } + return message; + }; + + /** + * Creates a plain object from a Text message. Also converts values to other types if specified. + * @function toObject + * @memberof Text + * @static + * @param {Text} message Text + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + Text.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.arrays || options.defaults) + object.payload = []; + if (message.payload && message.payload.length) { + object.payload = []; + for (let j = 0; j < message.payload.length; ++j) + object.payload[j] = message.payload[j]; + } + return object; + }; + + /** + * Converts this Text to JSON. + * @function toJSON + * @memberof Text + * @instance + * @returns {Object.} JSON object + */ + Text.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return Text; +})(); + +export const TimeStamps = $root.TimeStamps = (() => { + + /** + * Properties of a TimeStamps. + * @exports ITimeStamps + * @interface ITimeStamps + * @property {number|Long|null} [dawnTimestamp] TimeStamps dawnTimestamp + * @property {number|Long|null} [runtimeTimestamp] TimeStamps runtimeTimestamp + */ + + /** + * Constructs a new TimeStamps. + * @exports TimeStamps + * @classdesc Represents a TimeStamps. + * @implements ITimeStamps + * @constructor + * @param {ITimeStamps=} [properties] Properties to set + */ + function TimeStamps(properties) { + if (properties) + for (let keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * TimeStamps dawnTimestamp. + * @member {number|Long} dawnTimestamp + * @memberof TimeStamps + * @instance + */ + TimeStamps.prototype.dawnTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * TimeStamps runtimeTimestamp. + * @member {number|Long} runtimeTimestamp + * @memberof TimeStamps + * @instance + */ + TimeStamps.prototype.runtimeTimestamp = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * Creates a new TimeStamps instance using the specified properties. + * @function create + * @memberof TimeStamps + * @static + * @param {ITimeStamps=} [properties] Properties to set + * @returns {TimeStamps} TimeStamps instance + */ + TimeStamps.create = function create(properties) { + return new TimeStamps(properties); + }; + + /** + * Encodes the specified TimeStamps message. Does not implicitly {@link TimeStamps.verify|verify} messages. + * @function encode + * @memberof TimeStamps + * @static + * @param {ITimeStamps} message TimeStamps message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TimeStamps.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.dawnTimestamp != null && Object.hasOwnProperty.call(message, "dawnTimestamp")) + writer.uint32(/* id 1, wireType 1 =*/9).fixed64(message.dawnTimestamp); + if (message.runtimeTimestamp != null && Object.hasOwnProperty.call(message, "runtimeTimestamp")) + writer.uint32(/* id 2, wireType 1 =*/17).fixed64(message.runtimeTimestamp); + return writer; + }; + + /** + * Encodes the specified TimeStamps message, length delimited. Does not implicitly {@link TimeStamps.verify|verify} messages. + * @function encodeDelimited + * @memberof TimeStamps + * @static + * @param {ITimeStamps} message TimeStamps message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + TimeStamps.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a TimeStamps message from the specified reader or buffer. + * @function decode + * @memberof TimeStamps + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {TimeStamps} TimeStamps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TimeStamps.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + let end = length === undefined ? reader.len : reader.pos + length, message = new $root.TimeStamps(); + while (reader.pos < end) { + let tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + message.dawnTimestamp = reader.fixed64(); + break; + case 2: + message.runtimeTimestamp = reader.fixed64(); + break; + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a TimeStamps message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof TimeStamps + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {TimeStamps} TimeStamps + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + TimeStamps.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a TimeStamps message. + * @function verify + * @memberof TimeStamps + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + TimeStamps.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.dawnTimestamp != null && message.hasOwnProperty("dawnTimestamp")) + if (!$util.isInteger(message.dawnTimestamp) && !(message.dawnTimestamp && $util.isInteger(message.dawnTimestamp.low) && $util.isInteger(message.dawnTimestamp.high))) + return "dawnTimestamp: integer|Long expected"; + if (message.runtimeTimestamp != null && message.hasOwnProperty("runtimeTimestamp")) + if (!$util.isInteger(message.runtimeTimestamp) && !(message.runtimeTimestamp && $util.isInteger(message.runtimeTimestamp.low) && $util.isInteger(message.runtimeTimestamp.high))) + return "runtimeTimestamp: integer|Long expected"; + return null; + }; + + /** + * Creates a TimeStamps message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof TimeStamps + * @static + * @param {Object.} object Plain object + * @returns {TimeStamps} TimeStamps + */ + TimeStamps.fromObject = function fromObject(object) { + if (object instanceof $root.TimeStamps) + return object; + let message = new $root.TimeStamps(); + if (object.dawnTimestamp != null) + if ($util.Long) + (message.dawnTimestamp = $util.Long.fromValue(object.dawnTimestamp)).unsigned = false; + else if (typeof object.dawnTimestamp === "string") + message.dawnTimestamp = parseInt(object.dawnTimestamp, 10); + else if (typeof object.dawnTimestamp === "number") + message.dawnTimestamp = object.dawnTimestamp; + else if (typeof object.dawnTimestamp === "object") + message.dawnTimestamp = new $util.LongBits(object.dawnTimestamp.low >>> 0, object.dawnTimestamp.high >>> 0).toNumber(); + if (object.runtimeTimestamp != null) + if ($util.Long) + (message.runtimeTimestamp = $util.Long.fromValue(object.runtimeTimestamp)).unsigned = false; + else if (typeof object.runtimeTimestamp === "string") + message.runtimeTimestamp = parseInt(object.runtimeTimestamp, 10); + else if (typeof object.runtimeTimestamp === "number") + message.runtimeTimestamp = object.runtimeTimestamp; + else if (typeof object.runtimeTimestamp === "object") + message.runtimeTimestamp = new $util.LongBits(object.runtimeTimestamp.low >>> 0, object.runtimeTimestamp.high >>> 0).toNumber(); + return message; + }; + + /** + * Creates a plain object from a TimeStamps message. Also converts values to other types if specified. + * @function toObject + * @memberof TimeStamps + * @static + * @param {TimeStamps} message TimeStamps + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + TimeStamps.toObject = function toObject(message, options) { + if (!options) + options = {}; + let object = {}; + if (options.defaults) { + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.dawnTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.dawnTimestamp = options.longs === String ? "0" : 0; + if ($util.Long) { + let long = new $util.Long(0, 0, false); + object.runtimeTimestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.runtimeTimestamp = options.longs === String ? "0" : 0; + } + if (message.dawnTimestamp != null && message.hasOwnProperty("dawnTimestamp")) + if (typeof message.dawnTimestamp === "number") + object.dawnTimestamp = options.longs === String ? String(message.dawnTimestamp) : message.dawnTimestamp; + else + object.dawnTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.dawnTimestamp) : options.longs === Number ? new $util.LongBits(message.dawnTimestamp.low >>> 0, message.dawnTimestamp.high >>> 0).toNumber() : message.dawnTimestamp; + if (message.runtimeTimestamp != null && message.hasOwnProperty("runtimeTimestamp")) + if (typeof message.runtimeTimestamp === "number") + object.runtimeTimestamp = options.longs === String ? String(message.runtimeTimestamp) : message.runtimeTimestamp; + else + object.runtimeTimestamp = options.longs === String ? $util.Long.prototype.toString.call(message.runtimeTimestamp) : options.longs === Number ? new $util.LongBits(message.runtimeTimestamp.low >>> 0, message.runtimeTimestamp.high >>> 0).toNumber() : message.runtimeTimestamp; + return object; + }; + + /** + * Converts this TimeStamps to JSON. + * @function toJSON + * @memberof TimeStamps + * @instance + * @returns {Object.} JSON object + */ + TimeStamps.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + return TimeStamps; +})(); + +export { $root as default }; diff --git a/protos/run_mode.proto b/protos/run_mode.proto new file mode 100644 index 00000000..c173e3d8 --- /dev/null +++ b/protos/run_mode.proto @@ -0,0 +1,19 @@ +/* + * Defines a message for communicating the run mode + */ + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +enum Mode { + IDLE = 0; + AUTO = 1; + TELEOP = 2; + ESTOP = 3; + CHALLENGE = 4; +} + +message RunMode { + Mode mode = 1; +} diff --git a/protos/start_pos.proto b/protos/start_pos.proto new file mode 100644 index 00000000..4320ea73 --- /dev/null +++ b/protos/start_pos.proto @@ -0,0 +1,14 @@ +//Message for communicating starting position + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +enum Pos { //we can add more start positions in the future + LEFT = 0; + RIGHT = 1; +} + +message StartPos { + Pos pos = 1; +} \ No newline at end of file diff --git a/protos/text.proto b/protos/text.proto new file mode 100644 index 00000000..696b5efc --- /dev/null +++ b/protos/text.proto @@ -0,0 +1,12 @@ +/* + * Defines a message for communicating text data + */ + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +message Text { + repeated string payload = 1; //CHALLENGE_DATA: initial values or results of challenges + //LOG: list of log lines +} diff --git a/protos/timestamp.proto b/protos/timestamp.proto new file mode 100644 index 00000000..ac62dcbe --- /dev/null +++ b/protos/timestamp.proto @@ -0,0 +1,12 @@ +/* + * Defines a message for communicating time stamps + */ + +syntax = "proto3"; + +option optimize_for = LITE_RUNTIME; + +message TimeStamps { + fixed64 dawn_timestamp = 1; + fixed64 runtime_timestamp = 2; +} diff --git a/release.js b/release.js deleted file mode 100644 index 99f4d0cd..00000000 --- a/release.js +++ /dev/null @@ -1,48 +0,0 @@ -const minimist = require('minimist'); -const packager = require('electron-packager'); -const path = require('path'); -const { exec } = require('child_process'); -const { promisify } = require('util'); - -/* General release command: 'node release.js' - * For a specific target: 'node release.js --platform=... --arch=...' - */ -function pack(platform, arch) { - const packageOptions = { - dir: __dirname, // source dir - name: 'dawn', - icon: './icons/pieicon', - asar: true, - packageManager: 'yarn', - out: path.resolve('..'), // build in the parent dir - }; - - if (!platform || !arch) { - console.log('Packaging for all platforms'); - packageOptions.all = true; // build for all platforms and arch - } else { - console.log('Packaging for: ', platform, arch); - packageOptions.platform = platform; - packageOptions.arch = arch; - } - - packager(packageOptions) - .then(appPaths => Promise.all(appPaths.map(appPath => { - if (appPath === true) { - return; - } - console.log(`Zipping ${appPath}`); - return promisify(exec)(`cd .. && zip -r ${appPath}.zip ${path.basename(appPath)}`); - }))) - .catch(err => { - console.log(err); - }); -} - -function main() { - const argv = minimist(process.argv.slice(2)); - pack(argv.platform, argv.arch); - console.log('Packaging Done'); -} - -main(); diff --git a/release.ts b/release.ts new file mode 100644 index 00000000..17e19902 --- /dev/null +++ b/release.ts @@ -0,0 +1,40 @@ +/* eslint-disable */ + +import minimist from 'minimist'; +import packager, { Options } from 'electron-packager'; +import path from 'path'; +import { spawn } from 'child_process'; + +/* General release command: 'ts-node release.ts' + * For a specific target: 'ts-node release.ts --platform=... --arch=...' + */ +async function pack(args: minimist.ParsedArgs) { + const packageOptions: Options = { + dir: __dirname, // source dir + name: 'dawn', + icon: './icons/pieicon', + asar: true, + out: path.resolve('./dawn-packaged') // output to subdirectory + }; + + Object.keys(args).forEach((key: string) => { + packageOptions[key] = args[key]; + }); + + // platform is either 'darwin', 'linux', or 'win32' + packageOptions.platform = args.platform ? args.platform : 'all'; + console.log('Packaging for: ', packageOptions.platform); + + const appPaths: (string | boolean)[] = await packager(packageOptions); + + appPaths.map((appPath: string | boolean) => { + if (appPath == true) { + return; + } + console.log(`Zipping ${appPath}`); + + spawn('zip', ['-r', `${appPath}.zip`, `${appPath}`], { stdio: 'inherit' }); + }); +} + +pack(minimist(process.argv.slice(2))).then(() => console.log('Packaging Done')); diff --git a/renderer/actions/AlertActions.js b/renderer/actions/AlertActions.js deleted file mode 100644 index 20abfe02..00000000 --- a/renderer/actions/AlertActions.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Actions for asynchronous (non-blocking) alerts. - */ -import seedrandom from 'seedrandom'; - -const rng = seedrandom('alertseed'); - -export const addAsyncAlert = (heading, message) => ({ - type: 'ADD_ASYNC_ALERT', - id: rng.int32(), - heading, - message, -}); - -export const removeAsyncAlert = id => ({ - type: 'REMOVE_ASYNC_ALERT', - id, -}); diff --git a/renderer/actions/AlertActions.ts b/renderer/actions/AlertActions.ts new file mode 100644 index 00000000..7f90714e --- /dev/null +++ b/renderer/actions/AlertActions.ts @@ -0,0 +1,20 @@ +/** + * Actions for asynchronous (non-blocking) alerts. + */ +import * as consts from '../consts'; +import seedrandom from 'seedrandom'; +import { AlertActions } from '../types'; + +const rng = seedrandom('alertseed'); + +export const addAsyncAlert: AlertActions['addAsyncAlert'] = (heading: string, message: string) => ({ + type: consts.AlertActionsTypes.ADD_ASYNC_ALERT, + id: rng.int32(), + heading, + message, +}); + +export const removeAsyncAlert: AlertActions['removeAsyncAlert'] = (id: number) => ({ + type: consts.AlertActionsTypes.REMOVE_ASYNC_ALERT, + id, +}); diff --git a/renderer/actions/ConsoleActions.js b/renderer/actions/ConsoleActions.js deleted file mode 100644 index a2a1e99e..00000000 --- a/renderer/actions/ConsoleActions.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Actions for the console state. - */ - -export const updateConsole = value => ({ - type: 'UPDATE_CONSOLE', - consoleOutput: value, -}); - -export const clearConsole = () => ({ - type: 'CLEAR_CONSOLE', -}); - -export const toggleConsole = () => ({ - type: 'TOGGLE_CONSOLE', -}); diff --git a/renderer/actions/ConsoleActions.ts b/renderer/actions/ConsoleActions.ts new file mode 100644 index 00000000..a742f81b --- /dev/null +++ b/renderer/actions/ConsoleActions.ts @@ -0,0 +1,18 @@ +/** + * Actions for the console state. + */ +import * as consts from '../consts'; +import { ConsoleActions } from '../types'; + +export const updateConsole: ConsoleActions['updateConsole'] = (value: string[]) => ({ + type: consts.ConsoleActionsTypes.UPDATE_CONSOLE, + consoleOutput: value, +}); + +export const clearConsole: ConsoleActions['clearConsole'] = () => ({ + type: consts.ConsoleActionsTypes.CLEAR_CONSOLE, +}); + +export const toggleConsole: ConsoleActions['toggleConsole'] = () => ({ + type: consts.ConsoleActionsTypes.TOGGLE_CONSOLE, +}); diff --git a/renderer/actions/EditorActions.js b/renderer/actions/EditorActions.js deleted file mode 100644 index e6c93d82..00000000 --- a/renderer/actions/EditorActions.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Actions for the editor state. - */ - -export const editorUpdate = newVal => ({ - type: 'UPDATE_EDITOR', - code: newVal, -}); - -export const openFileSucceeded = (data, filepath) => ({ - type: 'OPEN_FILE_SUCCEEDED', - code: data, - filepath, -}); - -export const saveFileSucceeded = (data, filepath) => ({ - type: 'SAVE_FILE_SUCCEEDED', - code: data, - filepath, -}); - -export const openFile = () => ({ - type: 'OPEN_FILE', -}); - -export const dragFile = filepath => ({ - type: 'DRAG_FILE', - filepath, -}); - -export const saveFile = (saveAs = false) => ({ - type: 'SAVE_FILE', - saveAs, -}); - -export const deleteFile = () => ({ - type: 'DELETE_FILE', -}); - -export const createNewFile = () => ({ - type: 'CREATE_NEW_FILE', -}); - -export const downloadCode = () => ({ - type: 'DOWNLOAD_CODE', -}); - -export const uploadCode = () => ({ - type: 'UPLOAD_CODE', -}); diff --git a/renderer/actions/EditorActions.ts b/renderer/actions/EditorActions.ts new file mode 100644 index 00000000..3128202f --- /dev/null +++ b/renderer/actions/EditorActions.ts @@ -0,0 +1,70 @@ +import * as consts from '../consts'; +import { EditorActions } from '../types'; + +export const editorUpdate: EditorActions['editorUpdate'] = (newVal: string) => ({ + type: consts.EditorActionsTypes.UPDATE_EDITOR, + code: newVal +}); + +export const openFileSucceeded: EditorActions['openFileSucceeded'] = (data: string, filepath: string) => ({ + type: consts.EditorActionsTypes.OPEN_FILE_SUCCEEDED, + code: data, + filepath +}); + +export const saveFileSucceeded: EditorActions['saveFileSucceeded'] = (data: string, filepath: string) => ({ + type: consts.EditorActionsTypes.SAVE_FILE_SUCCEEDED, + code: data, + filepath +}); + +export const openFile: EditorActions['openFile'] = () => ({ + type: consts.EditorActionsTypes.OPEN_FILE +}); + +export const dragFile: EditorActions['dragFile'] = (filepath: string) => ({ + type: consts.EditorActionsTypes.DRAG_FILE, + filepath +}); + +export const saveFile: EditorActions['saveFile'] = (saveAs = false) => ({ + type: consts.EditorActionsTypes.SAVE_FILE, + saveAs +}); + +export const deleteFile: EditorActions['deleteFile'] = () => ({ + type: consts.EditorActionsTypes.DELETE_FILE +}); + +export const createNewFile: EditorActions['createNewFile'] = () => ({ + type: consts.EditorActionsTypes.CREATE_NEW_FILE +}); + +export const downloadCode: EditorActions['downloadCode'] = () => ({ + type: consts.EditorActionsTypes.DOWNLOAD_CODE +}); + +export const uploadCode: EditorActions['uploadCode'] = () => ({ + type: consts.EditorActionsTypes.UPLOAD_CODE +}); + +export const updateKeyboardBitmap: EditorActions['updateKeyboardBitmap'] = (keyboardBitmap: number) => ({ + type: consts.EditorActionsTypes.UPDATE_KEYBOARD_BITMAP, + keyboardBitmap +}); + +export const updateIsKeyboardModeToggled: EditorActions['updateIsKeyboardModeToggled'] = (isKeyboardToggled: boolean) => ({ + type: consts.EditorActionsTypes.UPDATE_IS_KEYBOARD_MODE_TOGGLED, + isKeyboardToggled +}); + +export const initiateLatencyCheck: EditorActions['initiateLatencyCheck'] = () => ({ + type: consts.EditorActionsTypes.INITIATE_LATENCY_CHECK +}); + +export const setLatencyValue: EditorActions['setLatencyValue'] = (latencyValue: number) => ({ + type: consts.EditorActionsTypes.SET_LATENCY_VALUE, + latencyValue +}) + + diff --git a/renderer/actions/FieldActions.js b/renderer/actions/FieldActions.js deleted file mode 100644 index 4088d472..00000000 --- a/renderer/actions/FieldActions.js +++ /dev/null @@ -1,42 +0,0 @@ -import { ActionTypes } from '../constants/Constants'; - -export const updateTimer = msg => ({ - type: ActionTypes.UPDATE_TIMER, - timeLeft: msg.total_stage_time - msg.stage_time_so_far, - stage: msg.stage_name, - totalTime: msg.total_stage_time, -}); - -export const updateHeart = () => ({ - type: ActionTypes.UPDATE_HEART, -}); - -export const updateMaster = msg => ({ - type: ActionTypes.UPDATE_MASTER, - blueMaster: msg.blue, - goldMaster: msg.gold, -}); - -export const updateMatch = msg => ({ - type: ActionTypes.UPDATE_MATCH, - matchNumber: msg.match_number, - teamNames: msg.team_names, - teamNumbers: msg.team_numbers, -}); - -export const updateRobot = msg => ({ - type: ActionTypes.UPDATE_ROBOT, - autonomous: msg.autonomous, - enabled: msg.enabled, -}); - -export const toggleFieldControl = msg => ({ - type: ActionTypes.FIELD_CONTROL, - fieldControl: msg, -}); - -export const updateFieldControl = msg => ({ - type: ActionTypes.UPDATE_FC_CONFIG, - stationNumber: msg.stationNumber, - bridgeAddress: msg.bridgeAddress, -}); diff --git a/renderer/actions/FieldActions.ts b/renderer/actions/FieldActions.ts new file mode 100644 index 00000000..9c22eda9 --- /dev/null +++ b/renderer/actions/FieldActions.ts @@ -0,0 +1,47 @@ +import * as consts from '../consts'; +import { FieldActions } from '../types'; + +export const updateTimer: FieldActions['updateTimer'] = (msg: { + total_stage_time: number; + stage_time_so_far: number; + stage_name: string; +}) => ({ + type: consts.FieldActionsTypes.UPDATE_TIMER, + timeLeft: msg.total_stage_time - msg.stage_time_so_far, + stage: msg.stage_name, + totalTime: msg.total_stage_time, +}); + +export const updateHeart: FieldActions['updateHeart'] = () => ({ + type: consts.FieldActionsTypes.UPDATE_HEART, +}); + +export const updateMaster: FieldActions['updateMaster'] = (msg: { blue: number; gold: number }) => ({ + type: consts.FieldActionsTypes.UPDATE_MASTER, + blueMasterTeamNumber: msg.blue, + goldMasterTeamNumber: msg.gold, +}); + +export const updateMatch: FieldActions['updateMatch'] = (msg: { match_number: number; team_names: string[]; team_numbers: number[] }) => ({ + type: consts.FieldActionsTypes.UPDATE_MATCH, + matchNumber: msg.match_number, + teamNames: msg.team_names, + teamNumbers: msg.team_numbers, +}); + +export const updateRobot: FieldActions['updateRobot'] = (msg: { autonomous: number; enabled: boolean }) => ({ + type: consts.FieldActionsTypes.UPDATE_ROBOT, + autonomous: msg.autonomous, + enabled: msg.enabled, +}); + +export const toggleFieldControl: FieldActions['toggleFieldControl'] = (msg: boolean) => ({ + type: consts.FieldActionsTypes.FIELD_CONTROL, + fieldControl: msg, +}); + +export const updateFieldControl: FieldActions['updateFieldControl'] = (msg: { stationNumber: number; bridgeAddress: string }) => ({ + type: consts.FieldActionsTypes.UPDATE_FC_CONFIG, + stationNumber: msg.stationNumber, + bridgeAddress: msg.bridgeAddress, +}); diff --git a/renderer/actions/GamepadsActions.js b/renderer/actions/GamepadsActions.js deleted file mode 100644 index 59404ac5..00000000 --- a/renderer/actions/GamepadsActions.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable import/prefer-default-export */ -export const updateGamepads = gamepads => ({ - type: 'UPDATE_GAMEPADS', - gamepads, -}); diff --git a/renderer/actions/GamepadsActions.ts b/renderer/actions/GamepadsActions.ts new file mode 100644 index 00000000..85ab89c7 --- /dev/null +++ b/renderer/actions/GamepadsActions.ts @@ -0,0 +1,9 @@ +/* eslint-disable import/prefer-default-export */ +import * as consts from '../consts'; +import { GamepadsActions } from '../types'; +import { Input } from '../../protos/protos'; + +export const updateGamepads: GamepadsActions['updateGamepads'] = (gamepads: Input[]) => ({ + type: consts.GamepadsActionsTypes.UPDATE_GAMEPADS, + gamepads, +}); diff --git a/renderer/actions/InfoActions.js b/renderer/actions/InfoActions.js deleted file mode 100644 index 26cfd5c8..00000000 --- a/renderer/actions/InfoActions.js +++ /dev/null @@ -1,30 +0,0 @@ -export const infoPerMessage = stateChange => ({ - type: 'PER_MESSAGE', - robotState: stateChange, -}); - -export const ansibleDisconnect = () => ({ - type: 'ANSIBLE_DISCONNECT', -}); - -export const runtimeConnect = () => ({ - type: 'RUNTIME_CONNECT', -}); - -export const masterStatus = () => ({ - type: 'MASTER_ROBOT', -}); - -export const runtimeDisconnect = () => ({ - type: 'RUNTIME_DISCONNECT', -}); - -export const updateCodeStatus = studentCodeStatus => ({ - type: 'CODE_STATUS', - studentCodeStatus, -}); - -export const ipChange = ipAddress => ({ - type: 'IP_CHANGE', - ipAddress, -}); diff --git a/renderer/actions/InfoActions.ts b/renderer/actions/InfoActions.ts new file mode 100644 index 00000000..2f7c7b63 --- /dev/null +++ b/renderer/actions/InfoActions.ts @@ -0,0 +1,38 @@ +import * as consts from '../consts'; +import { InfoActions } from '../types'; + +export const infoPerMessage: InfoActions['infoPerMessage'] = () => ({ + type: consts.InfoActionsTypes.PER_MESSAGE, +}); + +export const runtimeConnect: InfoActions['runtimeConnect'] = () => ({ + type: consts.InfoActionsTypes.RUNTIME_CONNECT, +}); + +export const runtimeDisconnect: InfoActions['runtimeDisconnect'] = () => ({ + type: consts.InfoActionsTypes.RUNTIME_DISCONNECT, +}); + +export const masterStatus: InfoActions['masterStatus'] = () => ({ + type: consts.InfoActionsTypes.MASTER_ROBOT, +}); + +export const updateCodeStatus: InfoActions['updateCodeStatus'] = (studentCodeStatus: number) => ({ + type: consts.InfoActionsTypes.CODE_STATUS, + studentCodeStatus, +}); + +export const ipChange: InfoActions['ipChange'] = (ipAddress: string) => ({ + type: consts.InfoActionsTypes.IP_CHANGE, + ipAddress +}); + +export const udpTunnelIpChange = (ipAddress: string) => ({ + type: consts.InfoActionsTypes.UDP_TUNNEL_IP_CHANGE, + ipAddress +}); + +export const sshIpChange = (ipAddress: string) => ({ + type: consts.InfoActionsTypes.SSH_IP_CHANGE, + ipAddress +}); diff --git a/renderer/actions/PeripheralActions.js b/renderer/actions/PeripheralActions.js deleted file mode 100644 index a842704d..00000000 --- a/renderer/actions/PeripheralActions.js +++ /dev/null @@ -1,10 +0,0 @@ -export const updatePeripherals = sensors => ({ - type: 'UPDATE_PERIPHERALS', - peripherals: sensors, -}); - -export const peripheralRename = (uid, newname) => ({ - type: 'PERIPHERAL_RENAME', - id: uid, - name: newname, -}); diff --git a/renderer/actions/PeripheralActions.ts b/renderer/actions/PeripheralActions.ts new file mode 100644 index 00000000..2a2fc896 --- /dev/null +++ b/renderer/actions/PeripheralActions.ts @@ -0,0 +1,13 @@ +import * as consts from '../consts'; +import { Peripheral, PeripheralActions } from '../types'; + +export const updatePeripherals: PeripheralActions['updatePeripherals'] = (peripherals: Peripheral[]) => ({ + type: consts.PeripheralActionsTypes.UPDATE_PERIPHERALS, + peripherals +}); + +export const peripheralRename: PeripheralActions['peripheralRename'] = (uid: number, newName: string) => ({ + type: consts.PeripheralActionsTypes.PERIPHERAL_RENAME, + id: uid, + name: newName, +}); diff --git a/renderer/actions/SettingsActions.js b/renderer/actions/SettingsActions.js deleted file mode 100644 index 6a8fd5a5..00000000 --- a/renderer/actions/SettingsActions.js +++ /dev/null @@ -1,9 +0,0 @@ -export const changeFontsize = newFontsize => ({ - type: 'CHANGE_FONTSIZE', - newFontsize, -}); - -export const changeTheme = theme => ({ - type: 'CHANGE_THEME', - theme, -}); diff --git a/renderer/actions/SettingsActions.ts b/renderer/actions/SettingsActions.ts new file mode 100644 index 00000000..887289ea --- /dev/null +++ b/renderer/actions/SettingsActions.ts @@ -0,0 +1,12 @@ +import * as consts from '../consts'; +import { SettingsActions } from '../types'; + +export const changeFontSize: SettingsActions['changeFontSize'] = (newFontSize: number) => ({ + type: consts.SettingsActionsTypes.CHANGE_FONT_SIZE, + newFontSize, +}); + +export const changeTheme: SettingsActions['changeTheme'] = (theme: string) => ({ + type: consts.SettingsActionsTypes.CHANGE_THEME, + theme, +}); diff --git a/renderer/components/App.js b/renderer/components/App.js deleted file mode 100644 index 49b0b15c..00000000 --- a/renderer/components/App.js +++ /dev/null @@ -1,180 +0,0 @@ -import React from 'react'; -import Joyride from 'react-joyride'; -import PropTypes from 'prop-types'; -import { remote, ipcRenderer } from 'electron'; -import { connect } from 'react-redux'; -import smalltalk from 'smalltalk'; -import Dashboard from './Dashboard'; -import DNav from './DNav'; -import joyrideSteps from './JoyrideSteps'; -import { removeAsyncAlert } from '../actions/AlertActions'; -import { updateFieldControl } from '../actions/FieldActions'; -import { logging, startLog } from '../utils/utils'; - -const storage = remote.require('electron-json-storage'); - -class AppComponent extends React.Component { - constructor(props) { - super(props); - this.state = { - steps: [], - tourRunning: false, - }; - this.addSteps = this.addSteps.bind(this); - this.addTooltip = this.addTooltip.bind(this); - this.startTour = this.startTour.bind(this); - this.joyrideCallback = this.joyrideCallback.bind(this); - this.updateAlert = this.updateAlert.bind(this); - startLog(); - } - - componentDidMount() { - this.addSteps(joyrideSteps); - ipcRenderer.on('start-interactive-tour', () => { - this.startTour(); - }); - storage.has('firstTime', (hasErr, hasKey) => { - if (hasErr) { - logging.log(hasErr); - return; - } - - if (!hasKey) { - this.startTour(); - storage.set('firstTime', { first: true }, (setErr) => { - if (setErr) logging.log(setErr); - }); - } - }); - - storage.get('fieldControl', (err, data) => { - if (err) { - logging.log(err); - return; - } - this.props.onFCUpdate(data); - ipcRenderer.send('FC_CONFIG_CHANGE', data); - }); - } - - componentWillReceiveProps(nextProps) { - const { asyncAlerts } = nextProps; - // If the alerts list has changed, display the latest one. - if (asyncAlerts !== this.props.asyncAlerts) { - const latestAlert = asyncAlerts[asyncAlerts.length - 1]; - if (latestAlert !== undefined) { - this.updateAlert(latestAlert); - } - } - } - - shouldComponentUpdate(nextProps, nextState) { - return nextProps !== this.props || nextState !== this.state; - } - - addSteps(steps) { - if (!Array.isArray(steps)) { - steps = [steps]; - } - if (steps.length === 0) { - return; - } - this.setState((currentState) => { - currentState.steps = currentState.steps.concat(steps); - return currentState; - }); - } - - addTooltip(data) { - this.joyride.addTooltip(data); - } - - startTour() { - this.setState({ tourRunning: true }); - } - - joyrideCallback(action) { - if (action.type === 'finished') { - this.setState({ tourRunning: false }); - this.joyride.reset(false); - } - } - - updateAlert(latestAlert) { - smalltalk.alert(latestAlert.heading, latestAlert.message).then(() => { - this.props.onAlertDone(latestAlert.id); - }, () => { - this.props.onAlertDone(latestAlert.id); - }); - } - - render() { - return ( -
- - { this.joyride = c; }} - steps={this.state.steps} - type="continuous" - showSkipButton - autoStart - run={this.state.tourRunning} - callback={this.joyrideCallback} - locale={{ - back: 'Previous', - close: 'Close', - last: 'End Tour', - next: 'Next', - skip: 'Skip Tour', - }} - /> -
- -
- ); - } -} - -AppComponent.propTypes = { - connectionStatus: PropTypes.bool.isRequired, - runtimeStatus: PropTypes.bool.isRequired, - masterStatus: PropTypes.bool.isRequired, - isRunningCode: PropTypes.bool.isRequired, - asyncAlerts: PropTypes.array.isRequired, - onAlertDone: PropTypes.func.isRequired, - onFCUpdate: PropTypes.func.isRequired, -}; - -const mapStateToProps = state => ({ - connectionStatus: state.info.connectionStatus, - runtimeStatus: state.info.runtimeStatus, - masterStatus: state.fieldStore.masterStatus, - isRunningCode: state.info.isRunningCode, - asyncAlerts: state.asyncAlerts, -}); - -const mapDispatchToProps = dispatch => ({ - onAlertDone(id) { - dispatch(removeAsyncAlert(id)); - }, - onFCUpdate: (ipAddress) => { - dispatch(updateFieldControl(ipAddress)); - }, -}); - -const App = connect(mapStateToProps, mapDispatchToProps)(AppComponent); - -export default App; diff --git a/renderer/components/App.tsx b/renderer/components/App.tsx new file mode 100644 index 00000000..c8aed043 --- /dev/null +++ b/renderer/components/App.tsx @@ -0,0 +1,200 @@ +import React from 'react'; +import Joyride, { Step } from 'react-joyride'; +import { remote, ipcRenderer } from 'electron'; +import * as electronJSONStorage from 'electron-json-storage'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import smalltalk from 'smalltalk'; +import { Dashboard } from './Dashboard'; +import { DNav } from './DNav'; +import { joyrideSteps } from './JoyrideSteps'; +import { removeAsyncAlert } from '../actions/AlertActions'; +import { updateFieldControl } from '../actions/FieldActions'; +import { logging, startLog } from '../utils/utils'; +import { FieldControlConfig } from '../types'; + +type ElectronJSONStorage = typeof electronJSONStorage; + +const storage = remote.require('electron-json-storage') as ElectronJSONStorage; + +interface AlertType { + heading: string; + message: string; + id: number; +} + +interface StateProps { + connectionStatus: boolean; + runtimeStatus: boolean; + masterStatus: boolean; + isRunningCode: boolean; + asyncAlerts: Array; +} + +interface DispatchProps { + onAlertDone: (id: number) => void; + onFCUpdate: (param: FieldControlConfig) => void; +} + +interface State { + steps: Array; + tourRunning: boolean; +} + +type Props = StateProps & DispatchProps; + +class AppComponent extends React.Component { + joyride: Joyride | null; + + constructor(props: Props) { + super(props); + this.state = { + steps: [], + tourRunning: false, + }; + startLog(); + } + + componentDidMount = () => { + this.addSteps(joyrideSteps); + ipcRenderer.on('start-interactive-tour', () => { + this.startTour(); + }); + storage.has('firstTime', (hasErr: any, hasKey: any) => { + if (hasErr) { + logging.log(hasErr); + return; + } + + if (!hasKey) { + this.startTour(); + storage.set('firstTime', { first: true }, (setErr: any) => { + if (setErr) logging.log(setErr); + }); + } + }); + + // eslint-disable-next-line @typescript-eslint/ban-types + storage.get('fieldControl', (err: any, data: object) => { + if (err) { + logging.log(err); + return; + } + const fieldControlConfig = data as FieldControlConfig; + this.props.onFCUpdate(fieldControlConfig); + ipcRenderer.send('FC_CONFIG_CHANGE', fieldControlConfig); + }); + }; + + componentWillReceiveProps = (nextProps: Props) => { + const { asyncAlerts } = nextProps; + // If the alerts list has changed, display the latest one. + if (asyncAlerts !== this.props.asyncAlerts) { + const latestAlert = asyncAlerts[asyncAlerts.length - 1] as AlertType; + if (latestAlert !== undefined) { + this.updateAlert(latestAlert); + } + } + }; + + shouldComponentUpdate = (nextProps: Props, nextState: State) => { + return nextProps !== this.props || nextState !== this.state; + }; + + addSteps = (steps: Array) => { + if (!Array.isArray(steps)) { + steps = [steps]; + } + if (steps.length === 0) { + return; + } + this.setState((currentState: { steps: Array }) => { + currentState.steps = currentState.steps.concat(steps); + return currentState; + }); + }; + + startTour = () => { + this.setState({ tourRunning: true }); + }; + + joyrideCallback = (action: { type: string }) => { + // Confirm this still works + if (action.type === 'finished') { + this.setState({ tourRunning: false }); + } + }; + + updateAlert = (latestAlert: AlertType) => { + smalltalk.alert(latestAlert.heading, latestAlert.message).then( + () => { + this.props.onAlertDone(latestAlert.id); + }, + () => { + this.props.onAlertDone(latestAlert.id); + } + ); + }; + + render() { + const { runtimeStatus, masterStatus, connectionStatus, isRunningCode } = this.props; + const { tourRunning } = this.state; + + return ( +
+ + { + this.joyride = c; + }} + steps={this.state.steps} + continuous={true} + showSkipButton + run={tourRunning} + callback={this.joyrideCallback} + locale={{ + back: 'Previous', + close: 'Close', + last: 'End Tour', + next: 'Next', + skip: 'Skip Tour', + }} + /> +
+ +
+ ); + } +} + +const mapStateToProps = (state: ApplicationState) => ({ + connectionStatus: state.info.connectionStatus, + runtimeStatus: state.info.runtimeStatus, + masterStatus: state.fieldStore.masterStatus, + asyncAlerts: state.asyncAlerts, + stationNumber: state.fieldStore.stationNumber, + isRunningCode: state.info.isRunningCode, +}); + +const mapDispatchToProps = (dispatch: Dispatch) => ({ + onAlertDone: (id: number) => { + dispatch(removeAsyncAlert(id)); + }, + onFCUpdate: (param: FieldControlConfig) => { + dispatch(updateFieldControl(param)); + }, +}); + +export const App = connect(mapStateToProps, mapDispatchToProps)(AppComponent); diff --git a/renderer/components/ConfigBox.js b/renderer/components/ConfigBox.js deleted file mode 100644 index f8035419..00000000 --- a/renderer/components/ConfigBox.js +++ /dev/null @@ -1,220 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { - Modal, - Button, - FormGroup, - Form, - FormControl, - ControlLabel, -} from 'react-bootstrap'; -import { remote, ipcRenderer } from 'electron'; -import { connect } from 'react-redux'; -import _ from 'lodash'; -import { getValidationState, logging } from '../utils/utils'; -import { updateFieldControl } from '../actions/FieldActions'; -import { ipChange } from '../actions/InfoActions'; - - -const storage = remote.require('electron-json-storage'); - -class ConfigBoxComponent extends React.Component { - constructor(props) { - super(props); - this.state = { - ipAddress: this.props.ipAddress, - fcAddress: this.props.fcAddress, - stationNumber: this.props.stationNumber, - originalIP: this.props.ipAddress, - originalSN: this.props.stationNumber, - originalFC: this.props.fcAddress, - }; - this.saveChanges = this.saveChanges.bind(this); - this.disableUploadUpdate = this.disableUploadUpdate.bind(this); - this.handleIpChange = this.handleIpChange.bind(this); - this.handleFcChange = this.handleFcChange.bind(this); - this.handleStationChange = this.handleStationChange.bind(this); - this.handleClose = this.handleClose.bind(this); - } - - - componentDidMount() { - storage.get('ipAddress', (err, data) => { - if (err) { - logging.log(err); - } else if (!_.isEmpty(data)) { - this.props.onIPChange(data); - this.setState({ - ipAddress: data, - originalIP: data, - }); - } - }); - - storage.get('fieldControl', (err, data) => { - if (err) { - logging.log(err); - } else if (!_.isEmpty(data)) { - const sn = data.stationNumber; - const ba = data.bridgeAddress; - this.setState({ - fcAddress: ba, - originalFC: ba, - stationNumber: sn, - originalSN: sn, - }); - } - }); - } - - saveChanges(e) { - e.preventDefault(); - this.props.onIPChange(this.state.ipAddress); - this.setState({ originalIP: this.state.ipAddress }); - storage.set('ipAddress', this.state.ipAddress, (err) => { - if (err) logging.log(err); - }); - - const newConfig = { - stationNumber: this.state.stationNumber, - bridgeAddress: this.state.fcAddress, - }; - this.props.onFCUpdate(newConfig); - this.setState({ - originalSN: this.state.stationNumber, - originalFC: this.state.fcAddress, - }); - storage.set('fieldControl', newConfig, (err) => { - if (err) logging.log(err); - }); - ipcRenderer.send('FC_CONFIG_CHANGE', newConfig); - - this.props.hide(); - } - - handleIpChange(e) { - this.setState({ ipAddress: e.target.value }); - } - - handleFcChange(e) { - this.setState({ fcAddress: e.target.value }); - } - - handleStationChange(e) { - this.setState({ stationNumber: e.target.value }); - } - - handleClose() { - this.setState({ - ipAddress: this.state.originalIP, - stationNumber: this.state.originalSN, - fcAddress: this.state.originalFC, - }); - this.props.hide(); - } - - disableUploadUpdate() { - return (getValidationState(this.state.ipAddress) === 'error') || - (getValidationState(this.state.fcAddress) === 'error') || - (this.state.stationNumber < 0 && this.state.stationNumber > 4); - } - - render() { - return ( - -
- - Dawn Configuration - - -

- Make sure only one computer (running instance of Dawn) is attempting - to connect to the robot at a time! (i.e. not trying to connect to the same IP Address) -

- - IP Address - - - - -

- Field Control Settings -

- - Field Control IP Address - - - - - = 0 && this.state.stationNumber <= 4) ? 'success' : 'error'} - > - Field Control Station Number - - - -
- - - -
-
- ); - } -} - -ConfigBoxComponent.propTypes = { - shouldShow: PropTypes.bool.isRequired, - hide: PropTypes.func.isRequired, - ipAddress: PropTypes.string.isRequired, - stationNumber: PropTypes.number.isRequired, - onIPChange: PropTypes.func.isRequired, - fcAddress: PropTypes.string.isRequired, - onFCUpdate: PropTypes.func.isRequired, -}; - -const mapDispatchToProps = dispatch => ({ - onIPChange: (ipAddress) => { - dispatch(ipChange(ipAddress)); - }, - onFCUpdate: (config) => { - dispatch(updateFieldControl(config)); - }, -}); - -const mapStateToProps = state => ({ - stationNumber: parseInt(state.fieldStore.stationNumber, 10), - fcAddress: state.fieldStore.bridgeAddress, -}); - -const ConfigBox = connect(mapStateToProps, mapDispatchToProps)(ConfigBoxComponent); - -export default ConfigBox; diff --git a/renderer/components/ConfigBox.tsx b/renderer/components/ConfigBox.tsx new file mode 100644 index 00000000..5dc1b189 --- /dev/null +++ b/renderer/components/ConfigBox.tsx @@ -0,0 +1,250 @@ +import React, { useState, useEffect } from 'react'; +import { Modal, Button, FormGroup, Form, FormControl, ControlLabel } from 'react-bootstrap'; +import { ipcRenderer } from 'electron'; +import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import _ from 'lodash'; +import { defaults, getValidationState, logging } from '../utils/utils'; +import { updateFieldControl } from '../actions/FieldActions'; +import { ipChange, udpTunnelIpChange, sshIpChange } from '../actions/InfoActions'; +import storage from 'electron-json-storage'; + +interface Config { + stationNumber: number; + bridgeAddress: string; +} + +interface StateProps { + stationNumber: number; + ipAddress: string; + udpTunnelAddress: string; + sshAddress: string; +} + +interface DispatchProps { + onIPChange: (ipAddress: string) => void; + onUDPTunnelingIpAddressChange: (ipAddress: string) => void; + onSSHAddressChange: (ipAddress: string) => void; + onFCUpdate: (config: Config) => void; +} + +interface OwnProps { + fcAddress: string; + shouldShow: boolean; + hide: () => void; +} + +type Props = StateProps & DispatchProps & OwnProps; + +export const ConfigBoxComponent = (props: Props) => { + const [ipAddress, setIPAddress] = useState(props.ipAddress); + const [udpTunnelIpAddress, setUDPTunnelIpAddress] = useState(props.udpTunnelAddress); + const [sshAddress, setSSHAddress] = useState(props.sshAddress); + const [fcAddress, setFCAddress] = useState(props.fcAddress); + const [stationNumber, setStationNumber] = useState(props.stationNumber); + const [originalIPAddress, setOriginalIPAddress] = useState(props.ipAddress); + const [originalUDPTunnelIpAddress, setOriginalUDPTunnelIpAddress] = useState(props.udpTunnelAddress); + const [originalSSHAddress, setOriginalSSHAddress] = useState(props.sshAddress); + const [originalStationNumber, setOriginalStationNumber] = useState(props.stationNumber); + const [originalFCAddress, setOriginalFCAddress] = useState(props.fcAddress); + + const saveChanges = (e: React.FormEvent
) => { + e.preventDefault(); + + props.onUDPTunnelingIpAddressChange(udpTunnelIpAddress); + setOriginalFCAddress(udpTunnelIpAddress); + storage.set('udpTunnelIpAddress', { udpTunnelIpAddress }, (err: any) => { + if (err) logging.log(err); + }); + + props.onIPChange(ipAddress); + setOriginalIPAddress(ipAddress); + storage.set('ipAddress', { ipAddress }, (err: any) => { + if (err) logging.log(err); + }); + + props.onSSHAddressChange(sshAddress); + setOriginalSSHAddress(sshAddress); + storage.set('sshAddress', { sshAddress }, (err: any) => { + if (err) { + logging.log(err); + } + }) + + const newConfig = { + stationNumber: stationNumber, + bridgeAddress: fcAddress, + }; + props.onFCUpdate(newConfig); + setOriginalStationNumber(stationNumber); + setOriginalFCAddress(fcAddress); + + storage.set('fieldControl', newConfig, (err: any) => { + if (err) logging.log(err); + }); + ipcRenderer.send('FC_CONFIG_CHANGE', newConfig); + + props.hide(); + }; + + const handleIpChange = (e: React.FormEvent) => { + setIPAddress(e.currentTarget.value); + }; + + const handleUDPTunnelIpChange = (e: React.FormEvent) => { + setUDPTunnelIpAddress(e.currentTarget.value); + }; + + const handleSSHIpChange = (e: React.FormEvent) => { + setSSHAddress(e.currentTarget.value); + } + + const handleFcChange = (e: React.FormEvent) => { + setFCAddress(e.currentTarget.value); + }; + + const handleStationChange = (e: React.FormEvent) => { + setStationNumber(parseInt(e.currentTarget.value)); + }; + + const handleClose = () => { + setIPAddress(originalIPAddress); + setStationNumber(originalStationNumber); + setFCAddress(originalFCAddress); + setUDPTunnelIpAddress(originalUDPTunnelIpAddress); + setSSHAddress(originalSSHAddress); + props.hide(); + }; + + const disableUploadUpdate = () => { + if (defaults.NGROK) { + return false; + } + return getValidationState(ipAddress) === 'error' || getValidationState(fcAddress) === 'error' || (stationNumber < 0 && stationNumber > 4); + }; + + useEffect(() => { + storage.get('ipAddress', (err: any, data: object) => { + if (err) { + logging.log(err); + } else if (!_.isEmpty(data)) { + const ipAddress = (data as { ipAddress: string | undefined }).ipAddress ?? defaults.IPADDRESS; + + props.onIPChange(ipAddress); + setIPAddress(ipAddress); + setOriginalIPAddress(ipAddress); + } + }); + + storage.get('udpTunnelIpAddress', (err: any, data: object) => { + if (err) { + logging.log(err); + } else if (!_.isEmpty(data)) { + const udpTunnelIpAddress = (data as { udpTunnelIpAddress: string | undefined }).udpTunnelIpAddress ?? defaults.IPADDRESS; + + props.onUDPTunnelingIpAddressChange(udpTunnelIpAddress); + setUDPTunnelIpAddress(udpTunnelIpAddress); + setOriginalUDPTunnelIpAddress(udpTunnelIpAddress); + } + }); + + storage.get('sshAddress', (err: any, data: object) => { + if (err) { + logging.log(err); + } else if (!_.isEmpty(data)) { + const sshAddress = (data as { sshAddress: string | undefined }).sshAddress ?? defaults.IPADDRESS; + + props.onSSHAddressChange(sshAddress); + setSSHAddress(sshAddress); + setOriginalSSHAddress(sshAddress); + } + }); + + storage.get('fieldControl', (err: any, data: object) => { + if (err) { + logging.log(err); + } else if (!_.isEmpty(data)) { + const { bridgeAddress, stationNumber } = data as Config; + setFCAddress(bridgeAddress); + setOriginalFCAddress(bridgeAddress); + setStationNumber(stationNumber); + setOriginalStationNumber(stationNumber); + } + }); + }, []); + + const { shouldShow } = props; + + return ( + + + + Dawn Configuration + + +

+ Make sure only one computer (running instance of Dawn) is attempting to connect to the robot at a time! (i.e. not trying to + connect to the same IP Address) +

+ + IP Address + + + + + + UDP Tunneling + + + + + + SSH Address + + + + +

Field Control Settings

+ + Field Control IP Address + + + + + = 0 && stationNumber <= 4 ? 'success' : 'error'}> + Field Control Station Number + + + +
+ + + + +
+ ); +}; + +const mapDispatchToProps = (dispatch: Dispatch) => ({ + onIPChange: (ipAddress: string) => { + dispatch(ipChange(ipAddress)); + }, + onUDPTunnelingIpAddressChange: (ipAddress: string) => { + dispatch(udpTunnelIpChange(ipAddress)); + }, + onSSHAddressChange: (ipAddress: string) => { + dispatch(sshIpChange(ipAddress)); + }, + onFCUpdate: (config: Config) => { + dispatch(updateFieldControl(config)); + } +}); + +const mapStateToProps = (state: ApplicationState) => ({ + stationNumber: state.fieldStore.stationNumber, + fcAddress: state.fieldStore.bridgeAddress, +}); + +export const ConfigBox = connect(mapStateToProps, mapDispatchToProps)(ConfigBoxComponent); diff --git a/renderer/components/ConsoleOutput.js b/renderer/components/ConsoleOutput.tsx similarity index 60% rename from renderer/components/ConsoleOutput.js rename to renderer/components/ConsoleOutput.tsx index 2c79e8f9..92c86a25 100644 --- a/renderer/components/ConsoleOutput.js +++ b/renderer/components/ConsoleOutput.tsx @@ -1,41 +1,57 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Panel } from 'react-bootstrap'; -class ConsoleOutput extends React.Component { - constructor(props) { +interface StateProps { + toggleConsole: () => void; + disableScroll: boolean; +} + +interface OwnProps { + height: number; + output: Array + show: boolean; +} + +type Props = StateProps & OwnProps; + +export class ConsoleOutput extends React.Component { + outerDiv: HTMLDivElement | null; + constructor(props: Props) { super(props); - this.scrollToBottom = this.scrollToBottom.bind(this); } - componentDidMount() { + componentDidMount = () => { this.scrollToBottom(); } - componentWillReceiveProps(nextProps) { - if (this.props.output.size === 0 && nextProps.output.size > 0 && !this.props.show) { + componentWillReceiveProps = (nextProps: Props) => { + if (this.props.output.length === 0 && nextProps.output.length > 0 && !this.props.show) { this.props.toggleConsole(); } } - componentDidUpdate() { + componentDidUpdate = () => { this.scrollToBottom(); } - scrollToBottom() { + scrollToBottom = () => { if (!this.props.disableScroll) { - this.outerDiv.scrollTop = this.outerDiv.scrollHeight; + if (this.outerDiv !== null) { + this.outerDiv.scrollTop = this.outerDiv.scrollHeight; + } } } render() { + const { show, output } = this.props; + const height = `${String(this.props.height)}px`; // TODO: Use Panel.Collapse return (
{ this.outerDiv = el; }} > - {this.props.output.map(line => ( + {output.map(line => ( {line} ))}
@@ -70,13 +86,3 @@ class ConsoleOutput extends React.Component { ); } } - -ConsoleOutput.propTypes = { - height: PropTypes.number.isRequired, - output: PropTypes.array.isRequired, - toggleConsole: PropTypes.func.isRequired, - show: PropTypes.bool.isRequired, - disableScroll: PropTypes.bool.isRequired, -}; - -export default ConsoleOutput; diff --git a/renderer/components/DNav.js b/renderer/components/DNav.js deleted file mode 100644 index 79efe4d4..00000000 --- a/renderer/components/DNav.js +++ /dev/null @@ -1,163 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import PropTypes from 'prop-types'; -import { - Navbar, - ButtonToolbar, - ButtonGroup, - Label, -} from 'react-bootstrap'; -import ConfigBox from './ConfigBox'; -import UpdateBox from './UpdateBox'; -import StatusLabel from './StatusLabel'; -import TooltipButton from './TooltipButton'; -import { VERSION } from '../constants/Constants'; -import { runtimeState } from '../utils/utils'; - -class DNavComponent extends React.Component { - constructor(props) { - super(props); - this.toggleUpdateModal = this.toggleUpdateModal.bind(this); - this.toggleConfigModal = this.toggleConfigModal.bind(this); - this.state = { - showUpdateModal: false, - showConfigModal: false, - }; - } - - toggleUpdateModal() { - this.setState({ showUpdateModal: !this.state.showUpdateModal }); - } - - toggleConfigModal() { - this.setState({ showConfigModal: !this.state.showConfigModal }); - } - - createHeader() { - if (this.props.fieldControlStatus) { - return `Dawn FC v${VERSION} ${(this.props.heart) ? '+' : '-'}`; - } - return `Dawn v${VERSION}`; - } - - createMaster() { - if (this.props.fieldControlStatus) { - return this.props.masterStatus; - } - return false; - } - - render() { - return ( - - - - - - {this.createHeader()} - - - - - {this.props.runtimeStatus ? - - - : '' - } - - - - - - - - - - - - - - - ); - } -} - -DNavComponent.propTypes = { - connectionStatus: PropTypes.bool.isRequired, - runtimeStatus: PropTypes.bool.isRequired, - masterStatus: PropTypes.bool.isRequired, - isRunningCode: PropTypes.bool.isRequired, - ipAddress: PropTypes.string.isRequired, - startTour: PropTypes.func.isRequired, - runtimeVersion: PropTypes.string.isRequired, - robotState: PropTypes.number.isRequired, - heart: PropTypes.bool.isRequired, - fieldControlStatus: PropTypes.bool.isRequired, - blueMaster: PropTypes.number.isRequired, - goldMaster: PropTypes.number.isRequired, -}; - -const mapStateToProps = state => ({ - masterStatus: state.fieldStore.masterStatus, - blueMaster: state.fieldStore.blueMaster, - goldMaster: state.fieldStore.goldMaster, - robotState: state.info.robotState, - heart: state.fieldStore.heart, - ipAddress: state.info.ipAddress, - fieldControlStatus: state.fieldStore.fieldControl, - runtimeVersion: state.peripherals.runtimeVersion, -}); - - -const DNav = connect(mapStateToProps)(DNavComponent); - -export default DNav; diff --git a/renderer/components/DNav.tsx b/renderer/components/DNav.tsx new file mode 100644 index 00000000..2e23ed29 --- /dev/null +++ b/renderer/components/DNav.tsx @@ -0,0 +1,178 @@ +import React, { useState } from 'react'; +import { connect } from 'react-redux'; +import { Navbar, ButtonToolbar, ButtonGroup, Label } from 'react-bootstrap'; +import { ConfigBox } from './ConfigBox'; +import { UpdateBox } from './UpdateBox'; +import { StatusLabel } from './StatusLabel'; +import { TooltipButton } from './TooltipButton'; +import { VERSION } from '../consts'; +import { robotState } from '../utils/utils'; + +interface StateProps { + runtimeVersion: string; + codeStatus: number; + heart: boolean; + blueMasterTeamNumber: number; + goldMasterTeamNumber: number; + ipAddress: string; + udpTunnelAddress: string; + sshAddress: string; + fieldControlStatus: boolean; + latencyValue: number +} + +interface OwnProps { + ipAddress: string; + startTour: () => void; + runtimeStatus: boolean; + masterStatus: boolean; + connectionStatus: boolean; + isRunningCode: boolean; +} + +type Props = StateProps & OwnProps; + +const LOW_LATENCY_THRESHOLD_MSEC = 200; +const HIGH_LATENCY_THRESHOLD_MSEC = 300; +const MSEC_IN_ONE_SECOND = 1000; + +/** + * 3 Icons at the top right of Dawn: Tour, RobotIP, Upload + * State controls toggling UpdateBox and ConfigBox + */ +const DNavComponent = (props: Props) => { + const [showUpdateModal, toggleUpdateModal] = useState(false); + const [showConfigModal, toggleConfigModal] = useState(false); + + const createHeader = () => { + if (props.fieldControlStatus) { + return `Dawn FC v${VERSION} ${props.heart ? '+' : '-'}`; + } + return `Dawn v${VERSION}`; + }; + + const getLatencyThresholdColor = (latency : number) => { + if (latency <= LOW_LATENCY_THRESHOLD_MSEC) { + return "success" + } else if (latency > LOW_LATENCY_THRESHOLD_MSEC && latency < HIGH_LATENCY_THRESHOLD_MSEC) { + return "warning" + } else { + return "danger" + } + } + + const formatLatencyValue = (latency: number) => { + if (latency > MSEC_IN_ONE_SECOND) { + latency = latency / MSEC_IN_ONE_SECOND; + return `${latency} sec`; + } + + return `${latency} ms`; + } + + const { + connectionStatus, + runtimeStatus, + masterStatus, + isRunningCode, + ipAddress, + udpTunnelAddress, + sshAddress, + runtimeVersion, + codeStatus, + blueMasterTeamNumber, + goldMasterTeamNumber, + fieldControlStatus, + startTour, + } = props; + + return ( + + toggleUpdateModal(!showUpdateModal)} + /> + toggleConfigModal(!showConfigModal)} /> + + {createHeader()} + + + + {runtimeStatus ? ( + + + + ) : ( + '' + )} + + + + + + + + + + + toggleConfigModal(!showConfigModal)} + id="update-address-button" + glyph="transfer" + disabled={false} + /> + toggleUpdateModal(!showUpdateModal)} + disabled={!runtimeStatus} + id="update-software-button" + glyph="cloud-upload" + /> + + + + + + ); +}; + +const mapStateToProps = (state: ApplicationState) => ({ + blueMasterTeamNumber: state.fieldStore.blueMasterTeamNumber, + goldMasterTeamNumber: state.fieldStore.goldMasterTeamNumber, + codeStatus: state.info.studentCodeStatus, + heart: state.fieldStore.heart, + ipAddress: state.info.ipAddress, + udpTunnelAddress: state.info.udpTunnelIpAddress, + sshAddress: state.info.sshAddress, + fieldControlStatus: state.fieldStore.fieldControl, + runtimeVersion: state.peripherals.runtimeVersion, + latencyValue: state.editor.latencyValue +}); + +export const DNav = connect(mapStateToProps)(DNavComponent); diff --git a/renderer/components/Dashboard.js b/renderer/components/Dashboard.js deleted file mode 100644 index 9cef72ff..00000000 --- a/renderer/components/Dashboard.js +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { Grid, Row, Col } from 'react-bootstrap'; -import PeripheralList from './PeripheralList'; -import GamepadList from './GamepadList'; -import EditorContainer from './EditorContainer'; - -const Dashboard = props => ( - - - - - - - - - - - -); - -Dashboard.propTypes = { - connectionStatus: PropTypes.bool.isRequired, - runtimeStatus: PropTypes.bool.isRequired, - isRunningCode: PropTypes.bool.isRequired, -}; - -export default Dashboard; diff --git a/renderer/components/Dashboard.tsx b/renderer/components/Dashboard.tsx new file mode 100644 index 00000000..fd0788a1 --- /dev/null +++ b/renderer/components/Dashboard.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Grid, Row, Col } from 'react-bootstrap'; +import { Step } from 'react-joyride'; +import PeripheralList from './PeripheralList'; +import { GamepadList } from './GamepadList'; +import { EditorContainer } from './EditorContainer'; + +interface StateProps { + addSteps: (steps: Array) => void; + connectionStatus: boolean; + runtimeStatus: boolean; + isRunningCode: boolean; // Currently not provided by runtime, and not used in Editor +} + +export const Dashboard = (props: StateProps) => ( + + + + + + + + + + + +); diff --git a/renderer/components/Editor.js b/renderer/components/Editor.tsx similarity index 68% rename from renderer/components/Editor.js rename to renderer/components/Editor.tsx index 3e43338e..a31e9545 100644 --- a/renderer/components/Editor.js +++ b/renderer/components/Editor.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Panel, ButtonGroup, @@ -13,54 +12,104 @@ import { Tooltip, } from 'react-bootstrap'; import AceEditor from 'react-ace'; +import { Ace } from 'ace-builds' import { remote, clipboard } from 'electron'; import storage from 'electron-json-storage'; import _ from 'lodash'; - // React-ace extensions and modes -import 'brace/ext/language_tools'; -import 'brace/ext/searchbox'; -import 'brace/mode/python'; +import 'ace-builds/src-noconflict/ext-language_tools'; +import 'ace-builds/src-noconflict/ext-searchbox'; +import 'ace-builds/src-noconflict/mode-python'; // React-ace themes -import 'brace/theme/monokai'; -import 'brace/theme/github'; -import 'brace/theme/tomorrow'; -import 'brace/theme/kuroir'; -import 'brace/theme/twilight'; -import 'brace/theme/xcode'; -import 'brace/theme/textmate'; -import 'brace/theme/solarized_dark'; -import 'brace/theme/solarized_light'; -import 'brace/theme/terminal'; - -import ConsoleOutput from './ConsoleOutput'; -import TooltipButton from './TooltipButton'; +import 'ace-builds/src-noconflict/theme-monokai'; +import 'ace-builds/src-noconflict/theme-github'; +import 'ace-builds/src-noconflict/theme-tomorrow'; +import 'ace-builds/src-noconflict/theme-kuroir'; +import 'ace-builds/src-noconflict/theme-twilight'; +import 'ace-builds/src-noconflict/theme-xcode'; +import 'ace-builds/src-noconflict/theme-textmate'; +import 'ace-builds/src-noconflict/theme-solarized_dark'; +import 'ace-builds/src-noconflict/theme-solarized_light'; +import 'ace-builds/src-noconflict/theme-terminal'; + +import { ConsoleOutput } from './ConsoleOutput'; +import { TooltipButton } from './TooltipButton'; +import { keyboardButtons, ROBOT_STAFF_CODE } from '../consts'; import { pathToName, robotState, timings, logging, windowInfo } from '../utils/utils'; const { dialog } = remote; const currentWindow = remote.getCurrentWindow(); -class Editor extends React.Component { +interface StateProps { + editorTheme: string; + editorCode: string; + latestSaveCode: string; + filepath: string; + fontSize: number; + showConsole: boolean; + consoleData: string[]; + runtimeStatus: boolean; + fieldControlActivity: boolean; + disableScroll: boolean; + consoleUnread: boolean; + latencyValue: number; +} + +interface OwnProps { + onAlertAdd: (heading: string, message: string) => void; + onEditorUpdate: (newVal: string) => void; + onSaveFile: (saveAs?: boolean) => void; + onDragFile: (filepath: string) => void; + onOpenFile: () => void; + onCreateNewFile: () => void; + onChangeTheme: (theme: string) => void; + onChangeFontsize: (newFontsize: number) => void; + toggleConsole: () => void; + onClearConsole: () => void; + onUpdateCodeStatus: (status: number) => void; + onDownloadCode: () => void; + onUploadCode: () => void; + onUpdateKeyboardBitmap: (keyboardBitmap: number) => void; + onUpdateKeyboardModeToggle: (isKeyboardToggled: boolean) => void; + onInitiateLatencyCheck: () => void; +} + +type Props = StateProps & OwnProps; + +interface State { + consoleHeight: number; + editorHeight: number | string; + mode: number; + modeDisplay: string; + simulate: boolean; + isRunning: boolean; + fontsize?: number; + isKeyboardModeToggled: boolean; + keyboardBitmap: number; +} + +export class Editor extends React.Component { + themes: string[]; + CodeEditor: AceEditor; /* * ASCII Enforcement */ - static onEditorPaste(pasteData) { - let correctedText = pasteData.text; + static onEditorPaste(correctedText: string) { correctedText = correctedText.normalize('NFD'); correctedText = correctedText.replace(/[”“]/g, '"'); correctedText = correctedText.replace(/[‘’]/g, "'"); - correctedText = Editor.correctText(correctedText); + Editor.correctText(correctedText); // TODO: Create some notification that an attempt was made at correcting non-ASCII chars. - pasteData.text = correctedText; // eslint-disable-line no-param-reassign + //pasteData.text = correctedText; // eslint-disable-line no-param-reassign } // TODO: Take onEditorPaste items and move to utils? - static correctText(text) { + static correctText(text: string) { return text.replace(/[^\x00-\x7F]/g, ''); // eslint-disable-line no-control-regex } - constructor(props) { + constructor(props: Props) { super(props); this.themes = [ 'monokai', @@ -74,43 +123,28 @@ class Editor extends React.Component { 'solarized_light', 'terminal', ]; - this.beforeUnload = this.beforeUnload.bind(this); - this.onWindowResize = this.onWindowResize.bind(this); - this.toggleConsole = this.toggleConsole.bind(this); - this.getEditorHeight = this.getEditorHeight.bind(this); - this.changeTheme = this.changeTheme.bind(this); - this.increaseFontsize = this.increaseFontsize.bind(this); - this.decreaseFontsize = this.decreaseFontsize.bind(this); - this.changeFontsizeToFont = this.changeFontsizeToFont.bind(this); - this.handleSubmitFontsize = this.handleSubmitFontsize.bind(this); - this.handleChangeFontsize = this.handleChangeFontsize.bind(this); - this.startRobot = this.startRobot.bind(this); - this.stopRobot = this.stopRobot.bind(this); - this.upload = this.upload.bind(this); - this.estop = this.estop.bind(this); - this.simulateCompetition = this.simulateCompetition.bind(this); - this.raiseConsole = this.raiseConsole.bind(this); - this.lowerConsole = this.lowerConsole.bind(this); - this.copyConsole = this.copyConsole.bind(this); this.state = { consoleHeight: windowInfo.CONSOLESTART, editorHeight: 0, // Filled in later during componentDidMount mode: robotState.TELEOP, modeDisplay: robotState.TELEOPSTR, + isRunning: false, simulate: false, + isKeyboardModeToggled: false, + keyboardBitmap: 0 }; } /* * Confirmation Dialog on Quit, Stored Editor Settings, Window Size-Editor Re-render */ - componentDidMount() { + componentDidMount = () => { this.CodeEditor.editor.setOptions({ enableBasicAutocompletion: true, enableLiveAutocompletion: true, }); const autoComplete = { - getCompletions(editor, session, pos, prefix, callback) { + getCompletions(_editor: Ace.Editor, _session: Ace.EditSession, _pos: Ace.Point, _prefix: string, callback: Ace.CompleterCallback) { callback(null, [ { value: 'Robot', score: 1000, meta: 'PiE API' }, { value: 'get_value', score: 900, meta: 'PiE API' }, @@ -158,58 +192,59 @@ class Editor extends React.Component { this.CodeEditor.editor.completers = [autoComplete]; this.onWindowResize(); - storage.get('editorTheme', (err, data) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + storage.get('editorTheme', (err: any, data: { theme?: string }) => { if (err) { logging.log(err); } else if (!_.isEmpty(data)) { - this.props.onChangeTheme(data.theme); + this.props.onChangeTheme(data.theme ?? 'github'); } }); - storage.get('editorFontSize', (err, data) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + storage.get('editorFontSize', (err: any, data: { editorFontSize?: number }) => { if (err) { logging.log(err); } else if (!_.isEmpty(data)) { - this.props.onChangeFontsize(data.editorFontSize); + this.props.onChangeFontsize(data.editorFontSize ?? 14); this.setState({ fontsize: this.props.fontSize }); } }); - window.addEventListener('beforeunload', this.beforeUnload); window.addEventListener('resize', this.onWindowResize, { passive: true }); - window.addEventListener('dragover', (e) => { + window.addEventListener('dragover', (e: any) => { e.preventDefault(); return false; }); - window.addEventListener('drop', (e) => { + window.addEventListener('drop', (e: any) => { e.preventDefault(); this.props.onDragFile(e.dataTransfer.files[0].path); return false; }); } - componentWillUnmount() { + componentWillUnmount = () => { window.removeEventListener('beforeunload', this.beforeUnload); window.removeEventListener('resize', this.onWindowResize); } - onWindowResize() { + onWindowResize = () => { // Trigger editor to re-render on window resizing. this.setState({ editorHeight: this.getEditorHeight() }); } - getEditorHeight() { + getEditorHeight = () => { const windowNonEditorHeight = windowInfo.NONEDITOR + - (this.props.showConsole * (this.state.consoleHeight + windowInfo.CONSOLEPAD)); + (+!!this.props.showConsole * (this.state.consoleHeight + windowInfo.CONSOLEPAD)); return `${String(window.innerHeight - windowNonEditorHeight)}px`; } - beforeUnload(event) { + beforeUnload = (event: any) => { // If there are unsaved changes and the user tries to close Dawn, // check if they want to save their changes first. if (this.hasUnsavedChanges()) { - const clickedId = dialog.showMessageBox(currentWindow, { + dialog.showMessageBox(currentWindow, { type: 'warning', buttons: ['Save...', 'Don\'t Save', 'Cancel'], defaultId: 0, @@ -217,29 +252,87 @@ class Editor extends React.Component { title: 'You have unsaved changes!', message: 'Do you want to save the changes made to your program?', detail: 'Your changes will be lost if you don\'t save them.', - }); - + }) // NOTE: For whatever reason, `event.preventDefault()` does not work within // beforeunload events, so we use `event.returnValue = false` instead. - // - // `clickedId` is the index of the clicked button in the button list above. - if (clickedId === 0) { - // FIXME: Figure out a way to make Save and Close, well, close. - event.returnValue = false; - this.props.onSaveFile(); - } else if (clickedId === 2) { - event.returnValue = false; - } + .then(clickedId => { + if (clickedId.response === 0) { + // FIXME: Figure out a way to make Save and Close, well, close. + event.returnValue = false; + this.props.onSaveFile(); + } else if (clickedId.response === 2) { + event.returnValue = false; + } + }) + } } - toggleConsole() { + bitShiftLeft = (value: number, numPositions: number) => { + return value * Math.pow(2, numPositions); + } + + toggleConsole = () => { this.props.toggleConsole(); // Resize since the console overlaps with the editor, but enough time for console changes setTimeout(() => this.onWindowResize(), 0.01); + }; + + checkLatency = () => { + this.props.onInitiateLatencyCheck(); + }; + + insertRobotStaffCode = () => { + this.props.onEditorUpdate(ROBOT_STAFF_CODE); + }; + + // toggle keyboard control and add/remove listening for key presses to control robot + toggleKeyboardControl = () => { + const { isKeyboardModeToggled } = this.state; + this.setState({ isKeyboardModeToggled: !isKeyboardModeToggled }); + this.props.onUpdateKeyboardModeToggle(!isKeyboardModeToggled); + + if (!isKeyboardModeToggled) { + // We need passive true so that we are able to remove the event listener when we are not in Keyboard Control mode + window.addEventListener('keydown', this.turnCharacterOn, { passive: true }); + window.addEventListener('keyup', this.turnCharacterOff, { passive: true }); + } else { + window.removeEventListener('keydown', this.turnCharacterOn); + window.removeEventListener('keyup', this.turnCharacterOff); + } + }; + + updateKeyboardBitmap = (currentCharacter: string, isKeyPressed: boolean) => { + const keyboardNum = keyboardButtons[currentCharacter]; + let newKeyboardBitmap: number = this.state.keyboardBitmap; + + const shift = this.bitShiftLeft(1, keyboardNum); + const MAX_INT32_BITS = 2147483648; // 2^31 + + const shiftHighBits = shift / MAX_INT32_BITS; + const shiftLowBits = shift % MAX_INT32_BITS; + const mapHighBits = newKeyboardBitmap / MAX_INT32_BITS; + const mapLowBits = newKeyboardBitmap % MAX_INT32_BITS; + + if (!isKeyPressed) { + newKeyboardBitmap = (~shiftHighBits & mapHighBits) * MAX_INT32_BITS + (~shiftLowBits & mapLowBits); + } else if (isKeyPressed) { + newKeyboardBitmap = (shiftHighBits | mapHighBits) * MAX_INT32_BITS + (shiftLowBits | mapLowBits); + } + + this.setState({ keyboardBitmap: newKeyboardBitmap }); + this.props.onUpdateKeyboardBitmap(this.state.keyboardBitmap); + }; + + turnCharacterOff = (e: KeyboardEvent) => { + // NOT THE ACTION updateKeyboardBitmap. THIS IS A LOCAL FUNCTION + this.updateKeyboardBitmap(e.key, false); + } + turnCharacterOn = (e: KeyboardEvent) => { + this.updateKeyboardBitmap(e.key, true) } - upload() { + upload = () => { const { filepath } = this.props; if (filepath === '') { this.props.onAlertAdd( @@ -270,26 +363,24 @@ class Editor extends React.Component { this.props.onUploadCode(); } - startRobot() { + startRobot = () => { + this.setState({ isRunning: true }); this.props.onUpdateCodeStatus(this.state.mode); - this.props.onClearConsole(); + // this.props.onClearConsole(); } - stopRobot() { + stopRobot = () => { this.setState({ simulate: false, + isRunning: false, modeDisplay: (this.state.mode === robotState.AUTONOMOUS) ? robotState.AUTOSTR : robotState.TELEOPSTR, }); this.props.onUpdateCodeStatus(robotState.IDLE); } - estop() { - this.setState({ simulate: false, modeDisplay: robotState.ESTOPSTR }); - this.props.onUpdateCodeStatus(robotState.ESTOP); - } - simulateCompetition() { + simulateCompetition = () => { this.setState({ simulate: true, modeDisplay: robotState.SIMSTR }); const simulation = new Promise((resolve, reject) => { logging.log(`Beginning ${timings.AUTO}s ${robotState.AUTOSTR}`); @@ -356,35 +447,35 @@ class Editor extends React.Component { }); } - hasUnsavedChanges() { + hasUnsavedChanges = () => { return (this.props.latestSaveCode !== this.props.editorCode); } - changeTheme(theme) { + changeTheme = (theme: string) => { this.props.onChangeTheme(theme); - storage.set('editorTheme', { theme }, (err) => { + storage.set('editorTheme', { theme }, (err: any) => { if (err) logging.log(err); }); } - increaseFontsize() { + increaseFontsize = () => { this.setState({ fontsize: this.props.fontSize + 1 }); this.props.onChangeFontsize(this.props.fontSize + 1); - storage.set('editorFontSize', { editorFontSize: this.props.fontSize + 1 }, (err) => { + storage.set('editorFontSize', { editorFontSize: this.props.fontSize + 1 }, (err: any) => { if (err) logging.log(err); }); } - handleChangeFontsize(event) { + handleChangeFontsize = (event: any) => { this.setState({ fontsize: event.target.value }); } - handleSubmitFontsize(event) { + handleSubmitFontsize = (event: any) => { this.changeFontsizeToFont(Number(this.state.fontsize)); event.preventDefault(); } - changeFontsizeToFont(fontSize) { + changeFontsizeToFont = (fontSize: number) => { if (fontSize > 28) { fontSize = 28; } @@ -393,31 +484,31 @@ class Editor extends React.Component { } this.props.onChangeFontsize(fontSize); this.setState({ fontsize: fontSize }); - storage.set('editorFontSize', { editorFontSize: fontSize }, (err) => { + storage.set('editorFontSize', { editorFontSize: fontSize }, (err: any) => { if (err) logging.log(err); }); } - raiseConsole() { + raiseConsole = () => { this.setState({ consoleHeight: this.state.consoleHeight + windowInfo.UNIT }, () => { this.onWindowResize(); }); } - lowerConsole() { + lowerConsole = () => { this.setState({ consoleHeight: this.state.consoleHeight - windowInfo.UNIT }, () => { this.onWindowResize(); }); } - copyConsole() { + copyConsole = () => { clipboard.writeText(this.props.consoleData.join('')); } - decreaseFontsize() { + decreaseFontsize = () => { this.setState({ fontsize: this.props.fontSize - 1 }); this.props.onChangeFontsize(this.props.fontSize - 1); - storage.set('editorFontSize', { editorFontSize: this.props.fontSize - 1 }, (err) => { + storage.set('editorFontSize', { editorFontSize: this.props.fontSize - 1 }, (err: any) => { if (err) logging.log(err); }); } @@ -427,6 +518,7 @@ class Editor extends React.Component { if (this.props.consoleUnread) { this.toggleConsole(); } + return ( @@ -447,7 +539,7 @@ class Editor extends React.Component { onClick={this.props.onOpenFile} >Open Save @@ -484,50 +576,37 @@ class Editor extends React.Component { text="Stop" onClick={this.stopRobot} glyph="stop" - disabled={!(this.props.isRunningCode || this.state.simulate)} + disabled={!(this.state.isRunning || this.state.simulate)} /> { - this.setState({ mode: robotState.TELEOP, modeDisplay: robotState.TELEOPSTR }); + this.setState({ mode: robotState.AUTONOMOUS, modeDisplay: robotState.AUTOSTR }); }} - > - Tele-Operated - + >Autonomous { - this.setState({ mode: robotState.AUTONOMOUS, modeDisplay: robotState.AUTOSTR }); + this.setState({ mode: robotState.TELEOP, modeDisplay: robotState.TELEOPSTR }); }} - > - Autonomous - + >Tele-Operated - Simulate Competition - + >Simulate Competition - {' '} @@ -586,39 +665,46 @@ class Editor extends React.Component { id="choose-font-size" > this.changeFontsizeToFont(8)} >8 this.changeFontsizeToFont(12)} >12 this.changeFontsizeToFont(14)} >14 this.changeFontsizeToFont(16)} >16 this.changeFontsizeToFont(20)} >20 this.changeFontsizeToFont(24)} >24 this.changeFontsizeToFont(28)} >28 - - {' '} - + + {' '} + - {this.themes.map(theme => ( + {this.themes.map((theme: string) => ( + + + + + { + if (this.props.editorCode !== this.props.latestSaveCode) { + const shouldOverwrite = window.confirm( + 'You currently have unsaved changes. Do you really want to overwrite your code with Staff Code?' + ); + + if (shouldOverwrite) { + this.insertRobotStaffCode(); + } + } else { + this.insertRobotStaffCode(); + } + }} + glyph="star" + disabled={false} + /> + - { this.CodeEditor = input; }} + ref={(input: AceEditor) => { this.CodeEditor = input; }} name="CodeEditor" height={this.state.editorHeight.toString()} value={this.props.editorCode} onChange={this.props.onEditorUpdate} onPaste={Editor.onEditorPaste} editorProps={{ $blockScrolling: Infinity }} + readOnly={this.state.isKeyboardModeToggled} /> ({ - editorCode: state.editor.editorCode, - editorTheme: state.settings.editorTheme, - filepath: state.editor.filepath, - fontSize: state.settings.fontSize, - latestSaveCode: state.editor.latestSaveCode, - showConsole: state.studentConsole.showConsole, - consoleData: state.studentConsole.consoleData, - ipAddress: state.info.ipAddress, - connectionStatus: state.info.connectionStatus, - notificationHold: state.info.notificationHold, - fieldControlActivity: state.info.fieldControlActivity, - disableScroll: state.studentConsole.disableScroll, - consoleUnread: state.studentConsole.consoleUnread, -}); - -const mapDispatchToProps = dispatch => ({ - onAlertAdd: (heading, message) => { - dispatch(addAsyncAlert(heading, message)); - }, - onEditorUpdate: (newVal) => { - dispatch(editorUpdate(newVal)); - }, - onSaveFile: (saveAs) => { - dispatch(saveFile(saveAs)); - }, - onOpenFile: () => { - dispatch(openFile()); - }, - onDragFile: (filepath) => { - dispatch(dragFile(filepath)); - }, - onCreateNewFile: () => { - dispatch(createNewFile()); - }, - onChangeTheme: (theme) => { - dispatch(changeTheme(theme)); - }, - onChangeFontsize: (newFontsize) => { - dispatch(changeFontsize(newFontsize)); - }, - toggleConsole: () => { - dispatch(toggleConsole()); - }, - onClearConsole: () => { - dispatch(clearConsole()); - }, - onUpdateCodeStatus: (status) => { - dispatch(updateCodeStatus(status)); - }, - onIPChange: (ipAddress) => { - dispatch(ipChange(ipAddress)); - }, - onDownloadCode: () => { - dispatch(downloadCode()); - }, - onUploadCode: () => { - dispatch(uploadCode()); - }, -}); - -const EditorContainer = connect(mapStateToProps, mapDispatchToProps)(Editor); - -export default EditorContainer; diff --git a/renderer/components/EditorContainer.ts b/renderer/components/EditorContainer.ts new file mode 100644 index 00000000..d38d6844 --- /dev/null +++ b/renderer/components/EditorContainer.ts @@ -0,0 +1,93 @@ +import { connect } from 'react-redux'; +import { Editor } from './Editor'; +import { + editorUpdate, + saveFile, + openFile, + dragFile, + createNewFile, + downloadCode, + initiateLatencyCheck, + uploadCode, + updateKeyboardBitmap, + updateIsKeyboardModeToggled +} from '../actions/EditorActions'; +import { changeTheme, changeFontSize } from '../actions/SettingsActions'; +import { toggleConsole, clearConsole } from '../actions/ConsoleActions'; +import { addAsyncAlert } from '../actions/AlertActions'; +import { updateCodeStatus, ipChange } from '../actions/InfoActions'; +import { Dispatch } from 'redux'; + +const mapStateToProps = (state: ApplicationState) => ({ + editorCode: state.editor.editorCode, + editorTheme: state.settings.editorTheme, + filepath: state.editor.filepath, + fontSize: state.settings.fontSize, + latestSaveCode: state.editor.latestSaveCode, + showConsole: state.console.showConsole, + consoleData: state.console.consoleData, + ipAddress: state.info.ipAddress, + connectionStatus: state.info.connectionStatus, + notificationHold: state.info.notificationHold, + fieldControlActivity: state.info.fieldControlActivity, + disableScroll: state.console.disableScroll, + consoleUnread: state.console.consoleUnread, + keyboardBitmap: state.editor.keyboardBitmap, + latencyValue: state.editor.latencyValue +}); + +const mapDispatchToProps = (dispatch: Dispatch) => ({ + onAlertAdd: (heading: string, message: string) => { + dispatch(addAsyncAlert(heading, message)); + }, + onEditorUpdate: (newVal: string) => { + dispatch(editorUpdate(newVal)); + }, + onSaveFile: (saveAs?: boolean) => { + dispatch(saveFile(saveAs)); + }, + onOpenFile: () => { + dispatch(openFile()); + }, + onDragFile: (filepath: string) => { + dispatch(dragFile(filepath)); + }, + onCreateNewFile: () => { + dispatch(createNewFile()); + }, + onChangeTheme: (theme: string) => { + dispatch(changeTheme(theme)); + }, + onChangeFontsize: (newFontsize: number) => { + dispatch(changeFontSize(newFontsize)); + }, + toggleConsole: () => { + dispatch(toggleConsole()); + }, + onClearConsole: () => { + dispatch(clearConsole()); + }, + onUpdateCodeStatus: (status: number) => { + dispatch(updateCodeStatus(status)); + }, + onIPChange: (ipAddress: string) => { + dispatch(ipChange(ipAddress)); + }, + onDownloadCode: () => { + dispatch(downloadCode()); + }, + onUploadCode: () => { + dispatch(uploadCode()); + }, + onUpdateKeyboardBitmap: (keyboardBitmap: number) => { + dispatch(updateKeyboardBitmap(keyboardBitmap)); + }, + onUpdateKeyboardModeToggle: (isKeyboardToggled: boolean) => { + dispatch(updateIsKeyboardModeToggled(isKeyboardToggled)); + }, + onInitiateLatencyCheck: () => { + dispatch(initiateLatencyCheck()) + } +}); + +export const EditorContainer = connect(mapStateToProps, mapDispatchToProps)(Editor); diff --git a/renderer/components/Gamepad.js b/renderer/components/Gamepad.js deleted file mode 100644 index 3d74aa0a..00000000 --- a/renderer/components/Gamepad.js +++ /dev/null @@ -1,136 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { - Modal, - Button, - ListGroupItem, - Table, -} from 'react-bootstrap'; -import _ from 'lodash'; -import numeral from 'numeral'; - -class Gamepad extends React.Component { - constructor(props) { - super(props); - this.state = { showModal: false }; - this.openModal = this.openModal.bind(this); - this.closeModal = this.closeModal.bind(this); - } - - closeModal() { - this.setState({ showModal: false }); - } - - openModal() { - this.setState({ showModal: true }); - } - - roundedValues() { - return { - axes: _.map(this.props.gamepad.axes, axis => numeral(axis).format('0.00000')), - buttons: _.map(this.props.gamepad.buttons, button => numeral(button).format('0')), - }; - } - - renderHeader() { - return ( -
-

Gamepad {this.props.index}

-
- ); - } - - render() { - if (!this.props.gamepad) { - return (
); - } - const values = this.roundedValues(); - return ( - -
- {this.renderHeader()} - -
- - - {this.renderHeader()} - - - gamepad - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Button012345678910111213141516
Value{values.buttons[0]}{values.buttons[1]}{values.buttons[2]}{values.buttons[3]}{values.buttons[4]}{values.buttons[5]}{values.buttons[6]}{values.buttons[7]}{values.buttons[8]}{values.buttons[9]}{values.buttons[10]}{values.buttons[11]}{values.buttons[12]}{values.buttons[13]}{values.buttons[14]}{values.buttons[15]}{values.buttons[16]}
- - - - - - - - - - - - - - - - - -
Axis0123
Value{values.axes[0]}{values.axes[1]}{values.axes[2]}{values.axes[3]}
-
-
-
- ); - } -} - -Gamepad.propTypes = { - gamepad: PropTypes.object.isRequired, - index: PropTypes.number.isRequired, -}; - -export default Gamepad; diff --git a/renderer/components/Gamepad.tsx b/renderer/components/Gamepad.tsx new file mode 100644 index 00000000..300e80e2 --- /dev/null +++ b/renderer/components/Gamepad.tsx @@ -0,0 +1,113 @@ +import React from 'react'; +import { + Modal, + Button, + ListGroupItem, + Table, +} from 'react-bootstrap'; +import _ from 'lodash'; +import numeral from 'numeral'; +import { Input } from '../../protos/protos'; + +interface OwnProps { + gamepad: Input; + index: number; +} + +type Props = OwnProps; + +interface State { + showModal: boolean; +} + +const NUM_GAMEPAD_BUTTONS = 17; +const NUM_GAMEPAD_AXES = 4; + +export class Gamepad extends React.Component { + constructor(props: Props) { + super(props); + this.state = { showModal: false }; + } + + closeModal = () => { + this.setState({ showModal: false }); + } + + openModal = () => { + this.setState({ showModal: true }); + } + + roundedValues = () => { + const gamepadButtons: string[] = []; + + for (let i = 0; i < NUM_GAMEPAD_BUTTONS; i++) { + gamepadButtons.push(numeral((Number(this.props.gamepad.buttons) & (1 << i)) >> i).format('0')); + } + + return { + axes: this.props.gamepad.axes.map((axis: number) => numeral(axis).format('0.00000')), + buttons: gamepadButtons + }; + }; + + renderHeader = () => { + return ( +
+

Gamepad {this.props.index}

+
+ ); + } + + render() { + const { gamepad } = this.props; + const { showModal } = this.state; + + if (!gamepad) { + return <>; + } + const values = this.roundedValues(); + return ( + +
+ {this.renderHeader()} + +
+ + + {this.renderHeader()} + + + gamepad + + + + + {_.range(NUM_GAMEPAD_BUTTONS).map((gamepadButtonNumber: number) => )} + + + + {_.range(NUM_GAMEPAD_BUTTONS).map((gamepadButtonNumber: number) => )} + + +
Button{gamepadButtonNumber}
Value{values.buttons[gamepadButtonNumber]}
+ + + + + {_.range(NUM_GAMEPAD_AXES).map((gamepadButtonAxis: number) => )} + + + + + {_.range(NUM_GAMEPAD_AXES).map((gamepadButtonAxis: number) => )} + + +
Axis{gamepadButtonAxis}
Value{values.axes[gamepadButtonAxis]}
+
+
+
+ ); + } +}; diff --git a/renderer/components/GamepadList.js b/renderer/components/GamepadList.tsx similarity index 58% rename from renderer/components/GamepadList.js rename to renderer/components/GamepadList.tsx index 96dbc6df..fddaa09a 100644 --- a/renderer/components/GamepadList.js +++ b/renderer/components/GamepadList.tsx @@ -1,17 +1,22 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Panel, ListGroup } from 'react-bootstrap'; import { connect } from 'react-redux'; - import _ from 'lodash'; -import Gamepad from './Gamepad'; +import { Gamepad } from './Gamepad'; +import { Input } from '../../protos/protos'; + +interface StateProps { + gamepads: Input[] | undefined; +} + +type Props = StateProps; -const GamepadListComponent = (props) => { +const GamepadListComponent = (props: Props) => { let interior; - if (_.some(props.gamepads, gamepad => gamepad !== undefined)) { + if (_.some(props.gamepads, (gamepad: Input) => gamepad !== undefined)) { interior = _.map( props.gamepads, - (gamepad, index) => , + (gamepad: Input, index: string) => , ); } else { interior = ( @@ -23,7 +28,6 @@ const GamepadListComponent = (props) => { } return ( @@ -37,14 +41,9 @@ const GamepadListComponent = (props) => { ); }; -GamepadListComponent.propTypes = { - gamepads: PropTypes.object.isRequired, -}; - -const mapStateToProps = state => ({ +const mapStateToProps = (state: ApplicationState) => ({ gamepads: state.gamepads.gamepads, }); -const GamepadList = connect(mapStateToProps)(GamepadListComponent); +export const GamepadList = connect(mapStateToProps)(GamepadListComponent); -export default GamepadList; diff --git a/renderer/components/JoyrideSteps.js b/renderer/components/JoyrideSteps.js deleted file mode 100644 index 63b9c2cb..00000000 --- a/renderer/components/JoyrideSteps.js +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Specifies the list of steps to follow in the joyride - * (the interactive intro tour). Each object in the list is a step. - */ -export default [ - { - title: 'Header and Version', - text: 'This header displays the version of Dawn that you have. We may periodically release updates to Dawn, so always make sure you have the latest version.', - selector: '#header-title', - position: 'bottom', - type: 'hover', - }, { - title: 'Status Indicator', - text: 'This displays your connection status with the robot and (when connected) the robot\'s current battery level. Keep an eye on the battery level and charge the battery whenever it is nearly drained. Allowing the battery level to drop too low could damage your battery permanently.', - selector: '#battery-indicator', - position: 'bottom', - type: 'hover', - }, { - title: 'Editor', - text: 'This is the code editor. Create and edit your robot\'s code here. The editor has autocompletion. Press CTRL/CMD-SPACEBAR to see autocomplete suggestions.', - selector: '.ace_editor', - position: 'bottom-left', - type: 'hover', - }, { - title: 'File operations', - text: 'Use these buttons to create, open, save, and upload code files. You can additionally download the robot\'s version of your code.', - selector: '#file-operations-buttons', - position: 'bottom', - type: 'hover', - }, { - title: 'Code execution', - text: 'Use these buttons to run and stop your code, including a last-ditch Emergency-Stop. In addition to changing state, there is an option to simulate the autonomous and teleop timings of a real match.', - selector: '#code-execution-buttons', - position: 'bottom', - type: 'hover', - }, { - title: 'Output Console', - text: 'Use these buttons to see and clear the console, along with changing its size and copying console text.', - selector: '#console-buttons', - position: 'bottom', - type: 'hover', - }, { - title: 'Editor Settings', - text: 'You can change the font size of the editor and change your editor\'s theme using these buttons. Your preferences will be saved automatically.', - selector: '#editor-settings-buttons', - position: 'bottom', - type: 'hover', - }, { - title: 'Peripherals', - text: 'This panel displays info about your robot\'s peripherals, including motors and sensors. You can click on a peripheral name to change it. The name you assign to a peripheral here is the same name you should use to reference the peripheral in your code.', - selector: '#peripherals-panel', - position: 'left', - type: 'hover', - }, { - title: 'Gamepads', - text: 'This panel displays all the connected gamepads. Once you have a gamepad connected, press the details buttons to see more gamepad details.', - selector: '#gamepads-panel', - position: 'left', - type: 'hover', - }, { - title: 'Updates', - text: 'Occasionally we may release updates to the robot\'s software. When this happens, you will download the update package and click on this button to upload it to the robot. Please do not restart your robot.', - selector: '#update-software-button', - position: 'left', - type: 'hover', - }, { - title: 'Robot IP', - text: 'This sets the IP address Dawn will use when trying to connect to the robot.', - selector: '#update-address-button', - position: 'left', - type: 'hover', - }, -]; diff --git a/renderer/components/JoyrideSteps.tsx b/renderer/components/JoyrideSteps.tsx new file mode 100644 index 00000000..787159ef --- /dev/null +++ b/renderer/components/JoyrideSteps.tsx @@ -0,0 +1,84 @@ +import { Placement } from 'react-joyride'; + +/* + * Specifies the list of steps to follow in the joyride + * (the interactive intro tour). Each object in the list is a step. + */ + +interface JoyrideSteps { + title: React.ReactNode; + content: React.ReactNode; + target: string | HTMLElement; + placement: Placement; + event: string; +} + +export const joyrideSteps: JoyrideSteps[] = [ + { + title: 'Header and Version', + content: 'This header displays the version of Dawn that you have. We may periodically release updates to Dawn, so always make sure you have the latest version.', + target: '#header-title', + placement: 'bottom', + event: 'hover', + }, { + title: 'Status Indicator', + content: 'This displays your connection status with the robot and (when connected) the robot\'s current battery level. Keep an eye on the battery level and charge the battery whenever it is nearly drained. Allowing the battery level to drop too low could damage your battery permanently.', + target: '#battery-indicator', + placement: 'bottom', + event: 'hover', + }, { + title: 'Editor', + content: 'This is the code editor. Create and edit your robot\'s code here. The editor has autocompletion. Press CTRL/CMD-SPACEBAR to see autocomplete suggestions.', + target: '.ace_editor', + placement: 'bottom-start', + event: 'hover', + }, { + title: 'File operations', + content: 'Use these buttons to create, open, save, and upload code files. You can additionally download the robot\'s version of your code.', + target: '#file-operations-buttons', + placement: 'bottom', + event: 'hover', + }, { + title: 'Code execution', + content: 'Use these buttons to run and stop your code, including a last-ditch Emergency-Stop. In addition to changing state, there is an option to simulate the autonomous and teleop timings of a real match.', + target: '#code-execution-buttons', + placement: 'bottom', + event: 'hover', + }, { + title: 'Output Console', + content: 'Use these buttons to see and clear the console, along with changing its size and copying console text.', + target: '#console-buttons', + placement: 'bottom', + event: 'hover', + }, { + title: 'Editor Settings', + content: 'You can change the font size of the editor and change your editor\'s theme using these buttons. Your preferences will be saved automatically.', + target: '#editor-settings-buttons', + placement: 'bottom', + event: 'hover', + }, { + title: 'Peripherals', + content: 'This panel displays info about your robot\'s peripherals, including motors and sensors. You can click on a peripheral name to change it. The name you assign to a peripheral here is the same name you should use to reference the peripheral in your code.', + target: '#peripherals-panel', + placement: 'left', + event: 'hover', + }, { + title: 'Gamepads', + content: 'This panel displays all the connected gamepads. Once you have a gamepad connected, press the details buttons to see more gamepad details.', + target: '#gamepads-panel', + placement: 'left', + event: 'hover', + }, { + title: 'Updates', + content: 'Occasionally we may release updates to the robot\'s software. When this happens, you will download the update package and click on this button to upload it to the robot. Please do not restart your robot.', + target: '#update-software-button', + placement: 'left', + event: 'hover', + }, { + title: 'Robot IP', + content: 'This sets the IP address Dawn will use when trying to connect to the robot.', + target: '#update-address-button', + placement: 'left', + event: 'hover', + }, +]; diff --git a/renderer/components/Peripheral.js b/renderer/components/Peripheral.tsx similarity index 57% rename from renderer/components/Peripheral.js rename to renderer/components/Peripheral.tsx index e4a1e2fb..0b9c4012 100644 --- a/renderer/components/Peripheral.js +++ b/renderer/components/Peripheral.tsx @@ -1,18 +1,11 @@ -/** - * Outer Component for Individual Peripherals - * - * Sets common interface for type-specific components - * Wraps such components in ListGroupItem for PeripheralList.js - */ - import React from 'react'; -import PropTypes from 'prop-types'; import { ListGroupItem } from 'react-bootstrap'; -import { PeripheralTypes } from '../constants/Constants'; -import BooleanSensor from './peripherals/BooleanSensor'; -import GenericPeripheral from './peripherals/GenericPeripheral'; -import GameValues from './peripherals/GameValues'; -import Motor from './peripherals/Motor'; +import { PeripheralTypes } from '../consts'; +import { BooleanSensor } from './peripherals/BooleanSensor'; +import { GenericPeripheral } from './peripherals/GenericPeripheral'; +import { GameValues } from './peripherals/GameValues'; +import { Motor } from './peripherals/Motor'; +import { Param } from '../../protos/protos'; // Mapping between peripheral types and components const typesToComponents = {}; @@ -21,9 +14,23 @@ typesToComponents[PeripheralTypes.SENSOR_BOOLEAN] = BooleanSensor; typesToComponents[PeripheralTypes.LimitSwitch] = BooleanSensor; typesToComponents[PeripheralTypes.GameValues] = GameValues; +interface OwnProps { + key: string; + uid: string; + name: string; + type: number; + params: Param[]; +} + +/** + * Outer Component for Individual Peripherals + * + * Sets common interface for type-specific components + * Wraps such components in ListGroupItem for PeripheralList.js + */ +export const Peripheral = (props: OwnProps) => { + const ActualPeripheral = typesToComponents[props.type] || GenericPeripheral; -const Peripheral = (props) => { - const ActualPeripheral = typesToComponents[props.device_type] || GenericPeripheral; return ( @@ -31,8 +38,3 @@ const Peripheral = (props) => { ); }; -Peripheral.propTypes = { - device_type: PropTypes.string.isRequired, -}; - -export default Peripheral; diff --git a/renderer/components/PeripheralList.js b/renderer/components/PeripheralList.js deleted file mode 100644 index 37de3c87..00000000 --- a/renderer/components/PeripheralList.js +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import _ from 'lodash'; -import { connect } from 'react-redux'; -import { Panel, PanelGroup, ListGroup } from 'react-bootstrap'; -import { PeripheralTypes } from '../constants/Constants'; -import Peripheral from './Peripheral'; - -const cleanerNames = {}; -cleanerNames[PeripheralTypes.MOTOR_SCALAR] = 'Motors'; -cleanerNames[PeripheralTypes.SENSOR_BOOLEAN] = 'Boolean Sensors'; -cleanerNames[PeripheralTypes.SENSOR_SCALAR] = 'Numerical Sensors'; -cleanerNames[PeripheralTypes.LimitSwitch] = 'Limit Switches'; -cleanerNames[PeripheralTypes.LineFollower] = 'Line Followers'; -cleanerNames[PeripheralTypes.Potentiometer] = 'Potentiometers'; -cleanerNames[PeripheralTypes.Encoder] = 'Encoders'; -cleanerNames[PeripheralTypes.MetalDetector] = 'Metal Detectors'; -cleanerNames[PeripheralTypes.ServoControl] = 'Servo Controllers'; -cleanerNames[PeripheralTypes.RFID] = 'RFID'; -cleanerNames[PeripheralTypes.YogiBear] = 'Yogi Bear'; -cleanerNames[PeripheralTypes.GameValues] = 'Game Values'; -cleanerNames[PeripheralTypes.PolarBear] = 'Polar Bear'; -cleanerNames[PeripheralTypes.KoalaBear] = 'Koala Bear'; - - -const filter = new Set([PeripheralTypes.TeamFlag]); - -const handleAccordion = (array) => { - const peripheralGroups = {}; - - array.filter(p => !filter.has(p.device_type)).forEach((p) => { - if (!(p.device_type in peripheralGroups)) { - peripheralGroups[p.device_type] = []; - } - peripheralGroups[p.device_type].push(p); - }); - return ( - _.map(Object.keys(peripheralGroups), groups => ( - - - - {cleanerNames[groups] || 'Generic'} - - - - { - _.map(peripheralGroups[groups], peripheral => ( - - )) - } - - - - - )) - ); -}; - - -const PeripheralListComponent = (props) => { - let errorMsg = null; - if (!props.connectionStatus) { - errorMsg = 'You are currently disconnected from the robot.'; - } else if (!props.runtimeStatus) { - errorMsg = 'There appears to be some sort of General error. ' + - 'No data is being received.'; - } - - let panelBody = null; - if (errorMsg) { - panelBody =

{errorMsg}

; - } else { - panelBody = handleAccordion(_.sortBy(_.toArray(props.peripherals.peripheralList), ['device_type'])); - } - - return ( - - Peripherals - - - {panelBody} - - - - ); -}; - -PeripheralListComponent.propTypes = { - connectionStatus: PropTypes.bool.isRequired, - runtimeStatus: PropTypes.bool.isRequired, - peripherals: PropTypes.object.isRequired, -}; - -const mapStateToProps = state => ({ - peripherals: state.peripherals, -}); - -const PeripheralList = connect(mapStateToProps)(PeripheralListComponent); - -export default PeripheralList; diff --git a/renderer/components/PeripheralList.tsx b/renderer/components/PeripheralList.tsx new file mode 100644 index 00000000..15d2b800 --- /dev/null +++ b/renderer/components/PeripheralList.tsx @@ -0,0 +1,115 @@ +import React from 'react'; +import _ from 'lodash'; +import { Panel, PanelGroup, ListGroup } from 'react-bootstrap'; +import { PeripheralTypes } from '../consts'; +import { Peripheral as PeripheralComponent } from './Peripheral'; +import { Peripheral, PeripheralList } from '../types'; +import { connect } from 'react-redux'; + +const cleanerNames = {}; +cleanerNames[PeripheralTypes.MOTOR_SCALAR] = 'Motors'; +cleanerNames[PeripheralTypes.SENSOR_BOOLEAN] = 'Boolean Sensors'; +cleanerNames[PeripheralTypes.SENSOR_SCALAR] = 'Numerical Sensors'; +cleanerNames[PeripheralTypes.LimitSwitch] = 'Limit Switches'; +cleanerNames[PeripheralTypes.LineFollower] = 'Line Followers'; +cleanerNames[PeripheralTypes.Potentiometer] = 'Potentiometers'; +cleanerNames[PeripheralTypes.Encoder] = 'Encoders'; +cleanerNames[PeripheralTypes.MetalDetector] = 'Metal Detectors'; +cleanerNames[PeripheralTypes.ServoControl] = 'Servo Controllers'; +cleanerNames[PeripheralTypes.RFID] = 'RFID'; +cleanerNames[PeripheralTypes.YogiBear] = 'Yogi Bear'; +cleanerNames[PeripheralTypes.GameValues] = 'Game Values'; +cleanerNames[PeripheralTypes.PolarBear] = 'Polar Bear'; +cleanerNames[PeripheralTypes.KoalaBear] = 'Koala Bear'; + +// const filter = new Set(); + +interface OwnProps { + connectionStatus: boolean; + runtimeStatus: boolean; +} + +interface StateProps { + peripheralList: PeripheralList; +} + +const handleAccordion = (devices: Peripheral[]) => { + const peripheralGroups: { [peripheralName: string]: Peripheral[] } = {}; + + // Filter and group peripherals by name (type) + devices + // .filter((p: Peripheral) => !filter.has(p.uid)) + .forEach((peripheral) => { + const group: Peripheral[] = peripheralGroups[peripheral.name] ?? []; + group.push(peripheral); + peripheralGroups[peripheral.name] = group; + }); + + return Object.keys(peripheralGroups).map((groupName: string) => { + const groupNameCleaned = groupName; //cleanerNames[groupName] as string; + + return ( + + + + + {groupName || 'Generic'} + + + + + {_.map(peripheralGroups[groupName], (peripheral) => ( + + ))} + + + + + ); + }); +}; + +const PeripheralListComponent = (props: StateProps & OwnProps) => { + let errorMsg = null; + + if (!props.connectionStatus) { + errorMsg = 'You are currently disconnected from the robot.'; + } else if (!props.runtimeStatus) { + errorMsg = 'There appears to be some sort of General error. No data is being received.'; + } + + let panelBody = null; + if (errorMsg) { + panelBody =

{errorMsg}

; + } else { + panelBody = handleAccordion(Object.values(props.peripheralList)); + } + + return ( + + Peripherals + + {panelBody} + + + ); +}; + +const mapStateToProps = (state: ApplicationState) => ({ + peripheralList: Object.assign({}, state.peripherals.peripheralList) +}); + +const PeripheralListContainer = connect(mapStateToProps)(PeripheralListComponent); + +export default PeripheralListContainer; diff --git a/renderer/components/StatusLabel.js b/renderer/components/StatusLabel.tsx similarity index 54% rename from renderer/components/StatusLabel.js rename to renderer/components/StatusLabel.tsx index 51213d61..59cf4f97 100644 --- a/renderer/components/StatusLabel.js +++ b/renderer/components/StatusLabel.tsx @@ -1,23 +1,40 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Label } from 'react-bootstrap'; import { connect } from 'react-redux'; import numeral from 'numeral'; -const StatusLabelComponent = (props) => { +interface StateProps { + connectionStatus: boolean; + runtimeStatus: boolean; + masterStatus: boolean; + batteryLevel?: number; + batterySafety?: boolean; + blueMasterTeamNumber: number; + goldMasterTeamNumber: number; + ipAddress: string; +} + +interface OwnProps { + fieldControlStatus?: boolean; + masterStatus: boolean; +} + +type Props = StateProps & OwnProps; + +const StatusLabelComponent = (props: Props) => { let labelStyle = 'default'; let labelText = 'Disconnected'; const masterRobotHeader = 'Master Robot: Team '; const teamIP = props.ipAddress.substring(props.ipAddress.length - 2, props.ipAddress.length); - const shouldDisplayMaster = teamNumber => parseInt(teamIP, 10) === teamNumber + const shouldDisplayMaster = (teamNumber: number) => parseInt(teamIP, 10) === teamNumber && props.fieldControlStatus; let masterRobot = null; let masterRobotStyle = ' '; - if (shouldDisplayMaster(props.blueMaster)) { - masterRobot = props.blueMaster; + if (shouldDisplayMaster(props.blueMasterTeamNumber)) { + masterRobot = props.blueMasterTeamNumber; masterRobotStyle = 'primary'; - } else if (shouldDisplayMaster(props.goldMaster)) { - masterRobot = props.goldMaster; + } else if (shouldDisplayMaster(props.goldMasterTeamNumber)) { + masterRobot = props.goldMasterTeamNumber; masterRobotStyle = 'warning'; } @@ -44,28 +61,9 @@ const StatusLabelComponent = (props) => { ); }; -StatusLabelComponent.propTypes = { - connectionStatus: PropTypes.bool.isRequired, - runtimeStatus: PropTypes.bool.isRequired, - batteryLevel: PropTypes.number.isRequired, - batterySafety: PropTypes.bool.isRequired, - blueMaster: PropTypes.number.isRequired, - goldMaster: PropTypes.number.isRequired, - ipAddress: PropTypes.string.isRequired, - fieldControlStatus: PropTypes.bool.isRequired, -}; - - -const mapStateToProps = state => ({ +const mapStateToProps = (state: ApplicationState) => ({ batteryLevel: state.peripherals.batteryLevel, batterySafety: state.peripherals.batterySafety, - masterStatus: state.fieldStore.masterStatus, - blueMaster: state.fieldStore.blueMaster, - goldMaster: state.fieldStore.goldMaster, - ipAddress: state.info.ipAddress, - fieldControlStatus: state.fieldStore.fieldControl, }); -const StatusLabel = connect(mapStateToProps)(StatusLabelComponent); - -export default StatusLabel; +export const StatusLabel = connect(mapStateToProps)(StatusLabelComponent); diff --git a/renderer/components/TooltipButton.js b/renderer/components/TooltipButton.tsx similarity index 61% rename from renderer/components/TooltipButton.js rename to renderer/components/TooltipButton.tsx index 39b2314b..ca108ffe 100644 --- a/renderer/components/TooltipButton.js +++ b/renderer/components/TooltipButton.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { Button, Glyphicon, @@ -7,7 +6,17 @@ import { Tooltip, } from 'react-bootstrap'; -const TooltipButton = (props) => { +interface StateProp{ + id: string; + text: string; + onClick: () => void; + glyph: string; + disabled: boolean; + bsStyle?: string; + placement?: string; +} + +export const TooltipButton = (props: StateProp) => { const tooltip = ( {props.text} ); @@ -27,14 +36,3 @@ const TooltipButton = (props) => { ); }; -TooltipButton.propTypes = { - id: PropTypes.string.isRequired, - text: PropTypes.string.isRequired, - onClick: PropTypes.func.isRequired, - glyph: PropTypes.string.isRequired, - disabled: PropTypes.bool.isRequired, - bsStyle: PropTypes.string, - placement: PropTypes.string, -}; - -export default TooltipButton; diff --git a/renderer/components/UpdateBox.js b/renderer/components/UpdateBox.tsx similarity index 54% rename from renderer/components/UpdateBox.js rename to renderer/components/UpdateBox.tsx index 12b5c0a1..79b2442b 100644 --- a/renderer/components/UpdateBox.js +++ b/renderer/components/UpdateBox.tsx @@ -1,51 +1,74 @@ +import { OpenDialogReturnValue, remote } from 'electron'; import React from 'react'; -import PropTypes from 'prop-types'; import { Modal, Button, } from 'react-bootstrap'; -import { remote } from 'electron'; import { connect } from 'react-redux'; +import { Dispatch } from 'redux'; +import { Client, SFTPWrapper } from 'ssh2'; import { addAsyncAlert } from '../actions/AlertActions'; -import { pathToName, defaults, logging } from '../utils/utils'; +import { defaults, logging } from '../utils/utils'; -const { dialog } = remote; -const { Client } = require('ssh2'); +interface StateProps { + connectionStatus: boolean; + runtimeStatus: boolean; + masterStatus: boolean; + isRunningCode: boolean; + ipAddress: string; +} + +interface DispatchProps { + onAlertAdd: (heading: string, message: string) => void; +} + +interface OwnProps { + shouldShow: boolean; + hide: () => void; +} + +type Props = StateProps & DispatchProps & OwnProps; -class UpdateBox extends React.Component { - constructor(props) { +interface State { + isUploading: boolean; + updateFilepath: string; +} + +class UpdateBoxContainer extends React.Component { + constructor(props: Props) { super(props); this.state = { isUploading: false, updateFilepath: '', }; - this.chooseUpdate = this.chooseUpdate.bind(this); - this.upgradeSoftware = this.upgradeSoftware.bind(this); - this.disableUploadUpdate = this.disableUploadUpdate.bind(this); } - chooseUpdate() { - dialog.showOpenDialog({ - filters: [{ name: 'Update Package', extensions: ['gz', 'tar.gz'] }], - }, (filepaths) => { - if (filepaths === undefined) return; - this.setState({ updateFilepath: filepaths[0] }); + chooseUpdate = () => { + remote.dialog.showOpenDialog({ + filters: [ + { name: 'Update Package', extensions: ['zip']} + ], + }).then((dialogReturn: OpenDialogReturnValue) => { + if (dialogReturn.filePaths.length > 0) { + this.setState({ updateFilepath: dialogReturn.filePaths[0] }); + } }); } - upgradeSoftware() { + upgradeSoftware = () => { this.setState({ isUploading: true }); - const update = pathToName(this.state.updateFilepath); + const RUNTIME_ZIP_REMOTE_PATH = '/tmp/runtime.zip'; + const conn = new Client(); conn.on('ready', () => { - conn.sftp((err, sftp) => { + conn.sftp((err: Error | undefined, sftp: SFTPWrapper) => { if (err) { - logging.log(err); + logging.log(err.message); } else { logging.log('SSH Connection'); sftp.fastPut( this.state.updateFilepath, - `./updates/${update}`, (err2) => { + RUNTIME_ZIP_REMOTE_PATH, (err2: any) => { conn.end(); this.setState({ isUploading: false }); this.props.hide(); @@ -60,7 +83,7 @@ class UpdateBox extends React.Component { this.props.onAlertAdd( 'Robot Update Initiated', `Update is installing and Runtime will restart soon. - Please leave your robot on for the next two minutes.`, + Please leave your robot on for the next 1 minute.`, ); } }, @@ -68,7 +91,7 @@ class UpdateBox extends React.Component { } }); }).connect({ - debug: (inpt) => { logging.log(inpt); }, + debug: (debugInfo: string) => { logging.log(debugInfo); }, host: this.props.ipAddress, port: defaults.PORT, username: defaults.USERNAME, @@ -76,9 +99,9 @@ class UpdateBox extends React.Component { }); } - disableUploadUpdate() { + disableUploadUpdate = () => { return ( - !(this.state.updateFilepath) || + !this.state.updateFilepath || this.state.isUploading || !(this.props.connectionStatus && this.props.runtimeStatus) || this.props.isRunningCode @@ -86,8 +109,11 @@ class UpdateBox extends React.Component { } render() { + const { shouldShow, hide } = this.props; + const { isUploading, updateFilepath } = this.state; + let modalBody = null; - if (this.state.isUploading) { + if (isUploading) { modalBody = (

PLEASE DO NOT TURN OFF ROBOT

@@ -97,15 +123,15 @@ class UpdateBox extends React.Component { } else { modalBody = ( -

Update Package (tar.gz file)

-
{this.state.updateFilepath ? this.state.updateFilepath : ''}
+

Update Package (.zip file)

+
{updateFilepath ? updateFilepath : ''}

); } return ( - + Upload Update @@ -117,7 +143,7 @@ class UpdateBox extends React.Component { onClick={this.upgradeSoftware} disabled={this.disableUploadUpdate()} > - {this.state.isUploading ? 'Uploading...' : 'Upload Files'} + {isUploading ? 'Uploading...' : 'Upload Files'} @@ -125,22 +151,10 @@ class UpdateBox extends React.Component { } } -UpdateBox.propTypes = { - shouldShow: PropTypes.bool.isRequired, - hide: PropTypes.func.isRequired, - connectionStatus: PropTypes.bool.isRequired, - runtimeStatus: PropTypes.bool.isRequired, - isRunningCode: PropTypes.bool.isRequired, - ipAddress: PropTypes.string.isRequired, - onAlertAdd: PropTypes.func.isRequired, -}; - -const mapDispatchToProps = dispatch => ({ - onAlertAdd: (heading, message) => { +const mapDispatchToProps = (dispatch: Dispatch) => ({ + onAlertAdd: (heading: string, message: string) => { dispatch(addAsyncAlert(heading, message)); }, }); -const UpdateBoxContainer = connect(null, mapDispatchToProps)(UpdateBox); - -export default UpdateBoxContainer; +export const UpdateBox = connect(null, mapDispatchToProps)(UpdateBoxContainer); diff --git a/renderer/components/peripherals/BooleanSensor.js b/renderer/components/peripherals/BooleanSensor.js deleted file mode 100644 index 9546929c..00000000 --- a/renderer/components/peripherals/BooleanSensor.js +++ /dev/null @@ -1,47 +0,0 @@ -/* eslint-disable camelcase */ -import React from 'react'; -import PropTypes from 'prop-types'; -import _ from 'lodash'; -import { PeripheralTypes } from '../../constants/Constants'; - -/** - * Boolean Sensor Component - */ -const formatBoolean = (peripheralType, peripheral) => { - let sensorValue = peripheral.int_value; - if (sensorValue === undefined) { - sensorValue = peripheral.bool_value; - } - if (peripheralType === PeripheralTypes.LimitSwitch) { - return (sensorValue) ? 'Closed' : 'Open'; - } - return sensorValue; -}; - -const BooleanSensor = ({ - id, device_name, device_type, param, -}) => ( -
-

-
{id}
-

- { - _.map(param, obj => ( -
-

- {`${obj.param}: ${formatBoolean(device_type, obj)}`} -

-
- )) - } -
-); - -BooleanSensor.propTypes = { - device_name: PropTypes.string.isRequired, - device_type: PropTypes.string.isRequired, - id: PropTypes.string.isRequired, - param: PropTypes.array.isRequired, -}; - -export default BooleanSensor; diff --git a/renderer/components/peripherals/BooleanSensor.tsx b/renderer/components/peripherals/BooleanSensor.tsx new file mode 100644 index 00000000..515afc66 --- /dev/null +++ b/renderer/components/peripherals/BooleanSensor.tsx @@ -0,0 +1,41 @@ +/* eslint-disable camelcase */ +import React from 'react'; +import _ from 'lodash'; +import { PeripheralTypes } from '../../consts'; +import { Param, Device } from '../../../protos/protos'; + +/** + * Boolean Sensor Component + */ +const formatBoolean = (peripheralType: any, peripheral: Param) => { + let sensorValue: boolean | number | null | undefined = peripheral.ival; + if (sensorValue === undefined) { + sensorValue = peripheral.bval; + } + if (peripheralType === PeripheralTypes.LimitSwitch) { + return (sensorValue) ? 'Closed' : 'Open'; + } + return sensorValue; +}; + +export const BooleanSensor = ({ + uid, + type, + params, +}: Device) => ( +
+

+
{uid}
+

+ { + _.map(params, obj => ( +
+

+ {`${obj.name}: ${formatBoolean(type, obj)}`} +

+
+ )) + } +
+); + diff --git a/renderer/components/peripherals/GameValues.js b/renderer/components/peripherals/GameValues.tsx similarity index 50% rename from renderer/components/peripherals/GameValues.js rename to renderer/components/peripherals/GameValues.tsx index bd602038..dc22f02d 100644 --- a/renderer/components/peripherals/GameValues.js +++ b/renderer/components/peripherals/GameValues.tsx @@ -1,23 +1,23 @@ /* eslint-disable camelcase */ import React from 'react'; -import PropTypes from 'prop-types'; import _ from 'lodash'; +import { Device } from '../../../protos/protos'; /** * Generic Peripheral for General Case */ -const GameValues = ({ - device_name, param, -}) => ( +export const GameValues = ({ + name, params, +}: Device) => (

-
{device_name}
+
{name}

{ - _.map(param, obj => ( -
-

- {obj.int_value} + _.map(params, obj => ( +
+

+ {obj.ival}

)) @@ -25,13 +25,6 @@ const GameValues = ({

); -GameValues.propTypes = { - device_name: PropTypes.string, - param: PropTypes.array.isRequired, -}; - GameValues.defaultProps = { device_name: 'Unknown Device', }; - -export default GameValues; diff --git a/renderer/components/peripherals/GenericPeripheral.js b/renderer/components/peripherals/GenericPeripheral.js deleted file mode 100644 index bb48fe13..00000000 --- a/renderer/components/peripherals/GenericPeripheral.js +++ /dev/null @@ -1,39 +0,0 @@ -/* eslint-disable camelcase */ -import React from 'react'; -import PropTypes from 'prop-types'; -import _ from 'lodash'; -import numeral from 'numeral'; - -/** - * Generic Peripheral for General Case - */ -const GenericPeripheral = ({ - id, device_name, param, -}) => ( -
-

-
{id}
-

- { - _.map(param, obj => ( -
-

- {`${obj.param}: ${numeral(obj.int_value || obj.float_value).format('+0.00')}`} -

-
- )) - } -
-); - -GenericPeripheral.propTypes = { - device_name: PropTypes.string, - id: PropTypes.string.isRequired, - param: PropTypes.array.isRequired, -}; - -GenericPeripheral.defaultProps = { - device_name: 'Unknown Device', -}; - -export default GenericPeripheral; diff --git a/renderer/components/peripherals/GenericPeripheral.tsx b/renderer/components/peripherals/GenericPeripheral.tsx new file mode 100644 index 00000000..9a4788dd --- /dev/null +++ b/renderer/components/peripherals/GenericPeripheral.tsx @@ -0,0 +1,61 @@ +import React from 'react'; +import _ from 'lodash'; +import { Peripheral } from '../../types'; +import { Param } from '../../../protos/protos'; + +interface ParamComponentProps { + uid: string; + param: Param; +} + +const getParamValue = (param: Param) => { + const precisionLimit = 5; + // By default, the val property that should be in the `param` argument isn't defined even though it is typecasted to Param. + // To fix this, we explicity run Param.fromObject with the `param` argument. + const paramVal = Param.fromObject(param).val; + let value: boolean | number | string; + + switch (paramVal) { + case 'bval': + value = Boolean(param.bval); + break; + case 'fval': + value = param.fval.toPrecision(precisionLimit); + break; + case 'ival': + value = param.ival; + break; + default: + value = 0; + } + + return String(value); +}; + +/** + * Param component that memoizes the display of a param value and will only rerender if the underlying data is different. + */ +const ParamComponent = React.memo( + (props: ParamComponentProps) => ( +
+

+ {`${props.param.name}: ${getParamValue(props.param)}`} +

+
+ ), + (prevProps, nextProps) => _.isEqual(prevProps, nextProps) +); + +/** + * Generic Peripheral for General Case + */ +export const GenericPeripheral = ({ uid, params }: Peripheral) => ( +
+

+
{uid}
+

+ {_.map(params, (param) => ( + + ))} +
+); diff --git a/renderer/components/peripherals/Motor.js b/renderer/components/peripherals/Motor.js deleted file mode 100644 index 3cf6ff39..00000000 --- a/renderer/components/peripherals/Motor.js +++ /dev/null @@ -1,38 +0,0 @@ -/* eslint-disable camelcase */ -import React from 'react'; -import PropTypes from 'prop-types'; -import _ from 'lodash'; -import numeral from 'numeral'; -import { ProgressBar } from 'react-bootstrap'; - -/** - * Motor Component - */ - -const Motor = ({ id, device_name, param }) => ( -
-

-
{id}
- Motor -

- { - _.map(param, obj => ( // TODO: Figure out if a ProgressBar is useful -
-

- {`${obj.param}: ${numeral(obj.float_value).format('+0.00')}`} - -

- -
- )) - } -
-); - -Motor.propTypes = { - device_name: PropTypes.string.isRequired, - id: PropTypes.string.isRequired, - param: PropTypes.array.isRequired, -}; - -export default Motor; diff --git a/renderer/components/peripherals/Motor.tsx b/renderer/components/peripherals/Motor.tsx new file mode 100644 index 00000000..dce7a4da --- /dev/null +++ b/renderer/components/peripherals/Motor.tsx @@ -0,0 +1,30 @@ +/* eslint-disable camelcase */ +import React from 'react'; +import _ from 'lodash'; +import numeral from 'numeral'; +import { ProgressBar } from 'react-bootstrap'; +import { Device } from '../../../protos/protos'; + +/** + * Motor Component + */ + +export const Motor = ({ uid, params }: Device) => ( +
+

+
{uid}
+ Motor +

+ { + _.map(params, obj => ( // TODO: Figure out if a ProgressBar is useful +
+

+ {`${obj.name}: ${numeral(obj.fval).format('+0.00')}`} + +

+ +
+ )) + } +
+); diff --git a/renderer/constants/Constants.js b/renderer/constants/Constants.js deleted file mode 100644 index 0e47c090..00000000 --- a/renderer/constants/Constants.js +++ /dev/null @@ -1,50 +0,0 @@ -import keyMirror from 'keymirror'; - -export const VERSION = '2.1.0'; -export const PeripheralTypes = keyMirror({ - MOTOR_SCALAR: null, - SENSOR_BOOLEAN: null, - SENSOR_SCALAR: null, - LimitSwitch: null, - LineFollower: null, - Potentiometer: null, - Encoder: null, - ColorSensor: null, - MetalDetector: null, - ExampleDevice: null, - ServoControl: null, - YogiBear: null, - RFID: null, - BatteryBuzzer: null, - TeamFlag: null, - GameValues: null, - master: null, - PolarBear: null, - KoalaBear: null, -}); - -export const ActionTypes = keyMirror({ - FIELD_CONTROL: null, - UPDATE_BATTERY: null, - UPDATE_GAMEPADS: null, - UPDATE_EDITOR: null, - UPDATE_FILENAMES: null, - UPDATE_FILENAME: null, - UPDATE_PERIPHERAL: null, - UPDATE_STATUS: null, - UPDATE_CONNECTION: null, - UPDATE_FC_CONFIG: null, - SAVE_FILE: null, - OPEN_FILE: null, - CLEAR_EDITOR: null, - UPDATE_CONSOLE: null, - UPDATE_TIMER: null, - UPDATE_HEART: null, - UPDATE_ROBOT: null, - UPDATE_MATCH: null, - UPDATE_MASTER: null, - ADD_ALERT: null, - REMOVE_ALERT: null, - CLEAR_CONSOLE: null, - runtime_version: null, -}); diff --git a/renderer/consts/actions.ts b/renderer/consts/actions.ts new file mode 100644 index 00000000..2155918b --- /dev/null +++ b/renderer/consts/actions.ts @@ -0,0 +1,64 @@ +export enum AlertActionsTypes { + ADD_ASYNC_ALERT = 'ADD_ASYNC_ALERT', + REMOVE_ASYNC_ALERT = 'REMOVE_ASYNC_ALERT', +} + +export enum ConsoleActionsTypes { + UPDATE_CONSOLE = 'UPDATE_CONSOLE', + CLEAR_CONSOLE = 'CLEAR_CONSOLE', + TOGGLE_CONSOLE = 'TOGGLE_CONSOLE', + TOGGLE_SCROLL = 'TOGGLE_SCROLL', +} + +export enum PeripheralActionsTypes { + UPDATE_PERIPHERALS = 'UPDATE_PERIPHERALS', + PERIPHERAL_RENAME = 'PERIPHERAL_RENAME', +} + +export enum EditorActionsTypes { + UPDATE_EDITOR = 'UPDATE_EDITOR', + OPEN_FILE_SUCCEEDED = 'OPEN_FILE_SUCCEEDED', + SAVE_FILE_SUCCEEDED = 'SAVE_FILE_SUCCEEDED', + OPEN_FILE = 'OPEN_FILE', + DRAG_FILE = 'DRAG_FILE', + SAVE_FILE = 'SAVE_FILE', + DELETE_FILE = 'DELETE_FILE', + CREATE_NEW_FILE = 'CREATE_NEW_FILE', + DOWNLOAD_CODE = 'DOWNLOAD_CODE', + UPLOAD_CODE = 'UPLOAD_CODE', + UPDATE_KEYBOARD_BITMAP = 'UPDATE_KEYBOARD_BITMAP', + UPDATE_IS_KEYBOARD_MODE_TOGGLED = 'UPDATE_IS_KEYBOARD_MODE_TOGGLED', + INITIATE_LATENCY_CHECK = 'INITIATE_LATENCY_CHECK', + SET_LATENCY_VALUE = 'SET_LATENCY_VALUE' +} + +export enum GamepadsActionsTypes { + UPDATE_GAMEPADS = 'UPDATE_GAMEPADS', +} + +export enum SettingsActionsTypes { + CHANGE_FONT_SIZE = 'CHANGE_FONTSIZE', + CHANGE_THEME = 'CHANGE_THEME', +} + +export enum InfoActionsTypes { + PER_MESSAGE = 'PER_MESSAGE', + RUNTIME_CONNECT = 'RUNTIME_CONNECT', + MASTER_ROBOT = 'MASTER_ROBOT', + RUNTIME_DISCONNECT = 'RUNTIME_DISCONNECT', + CODE_STATUS = 'CODE_STATUS', + IP_CHANGE = 'IP_CHANGE', + UDP_TUNNEL_IP_CHANGE = 'UDP_TUNNEL_IP_CHANGE', + SSH_IP_CHANGE = 'SSH_IP_CHANGE', + NOTIFICATION_CHANGE = 'NOTIFICATION_CHANGE', +} + +export enum FieldActionsTypes { + UPDATE_TIMER = 'UPDATE_TIMER', + UPDATE_HEART = 'UPDATE_HEART', + UPDATE_MASTER = 'UPDATE_MASTER', + UPDATE_MATCH = 'UPDATE_MATCH', + UPDATE_ROBOT = 'UPDATE_ROBOT', + FIELD_CONTROL = 'FIELD_CONTROL', + UPDATE_FC_CONFIG = 'UPDATE_FC_CONFIG', +} diff --git a/renderer/consts/index.ts b/renderer/consts/index.ts new file mode 100644 index 00000000..f949f7e5 --- /dev/null +++ b/renderer/consts/index.ts @@ -0,0 +1,14 @@ +export { + AlertActionsTypes, + ConsoleActionsTypes, + PeripheralActionsTypes, + EditorActionsTypes, + GamepadsActionsTypes, + SettingsActionsTypes, + InfoActionsTypes, + FieldActionsTypes, +} from './actions'; +export { keyboardButtons } from './keyboard-buttons'; +export { ROBOT_STAFF_CODE } from './robotStaffCode'; +export { PeripheralTypes } from './peripheral-types'; +export { VERSION } from './version'; diff --git a/renderer/consts/keyboard-buttons.ts b/renderer/consts/keyboard-buttons.ts new file mode 100644 index 00000000..30b33dc2 --- /dev/null +++ b/renderer/consts/keyboard-buttons.ts @@ -0,0 +1,49 @@ +export const keyboardButtons = { + a: 0, + b: 1, + c: 2, + d: 3, + e: 4, + f: 5, + g: 6, + h: 7, + i: 8, + j: 9, + k: 10, + l: 11, + m: 12, + n: 13, + o: 14, + p: 15, + q: 16, + r: 17, + s: 18, + t: 19, + u: 20, + v: 21, + w: 22, + x: 23, + y: 24, + z: 25, + '1': 26, + '2': 27, + '3': 28, + '4': 29, + '5': 30, + '6': 31, + '7': 32, + '8': 33, + '9': 34, + '0': 35, + ',': 36, + '.': 37, + '/': 38, + ';': 39, + "'": 40, + '[': 41, + ']': 42, + ArrowLeft: 43, + ArrowRight: 44, + ArrowUp: 45, + ArrowDown: 46 +}; diff --git a/renderer/consts/peripheral-types.ts b/renderer/consts/peripheral-types.ts new file mode 100644 index 00000000..6ed75d23 --- /dev/null +++ b/renderer/consts/peripheral-types.ts @@ -0,0 +1,23 @@ +import keyMirror from 'keymirror'; + +export const PeripheralTypes = keyMirror({ + MOTOR_SCALAR: null, + SENSOR_BOOLEAN: null, + SENSOR_SCALAR: null, + LimitSwitch: null, + LineFollower: null, + Potentiometer: null, + Encoder: null, + ColorSensor: null, + MetalDetector: null, + ExampleDevice: null, + ServoControl: null, + YogiBear: null, + RFID: null, + BatteryBuzzer: null, + TeamFlag: null, + GameValues: null, + master: null, + PolarBear: null, + KoalaBear: null, +}); diff --git a/renderer/consts/robotStaffCode.tsx b/renderer/consts/robotStaffCode.tsx new file mode 100644 index 00000000..1f510cd3 --- /dev/null +++ b/renderer/consts/robotStaffCode.tsx @@ -0,0 +1,99 @@ +export const ROBOT_STAFF_CODE = `# NOTE FROM PIE STAFF +# This code has not been tested thoroughly on robots; it is meant to be guidance to help improve +# the code you currently have. It will be tested throughout the week and will be available for you +# to use during final competition if you are unable to get working code on your testing day. +# (And yes, it is intentionally hard to use....) + +# Device IDs +MOTOR_ID = "6_1" +ARM_MOTOR_ID = "6_2" +LINE_FOLLOWER_ID = "2_3" + +# Motors +LEFT_MTR = "b" +RIGHT_MTR = "a" +ARM_MTR = "b" + +# Controls (change these to your preferences) +LEFT_MOTOR_FORWARD = "q" +LEFT_MOTOR_BACKWARD = "w" +RIGHT_MOTOR_FORWARD = "o" +RIGHT_MOTOR_BACKWARD = "p" + +ARM_DOWN = "t" +ARM_UP = "u" + +# Arm positions +# (NOT TESTED! You need to find positions that work based on your arm and your reference encoder value) +ARM_DOWN_POS = 25 +ARM_UP_POS = 75 + +# Motor Inversions (need to specify / change depending on your control scheme) +LEFT_MTR_INVERT = False +RIGHT_MTR_INVERT = True + +# Misc +ARM_SPEED = 0.05 # Change this + +def autonomous_setup(): + # Set motor inversions + Robot.set_value(MOTOR_ID, "invert_" + LEFT_MTR, LEFT_MTR_INVERT) + Robot.set_value(MOTOR_ID, "invert_" + RIGHT_MTR, RIGHT_MTR_INVERT) + + # Disable motor PID + Robot.set_value(MOTOR_ID, "pid_enabled_" + LEFT_MTR, False) + Robot.set_value(MOTOR_ID, "pid_enabled_" + RIGHT_MTR, False) + + # Tell PiE staff to put arm into reset position before running + # This line will set the position of the arm to an encoder value of 0 + Robot.set_value(ARM_MOTOR_ID, "enc_" + ARM_MTR, 0) + +def autonomous_main(): + # Autonomous code can go here (or, if more complex, + # put in separate function and Robot.run() in autonomous_setup() ) + Robot.set_value(MOTOR_ID, "velocity_" + LEFT_MTR, -0.15) + Robot.set_value(MOTOR_ID, "velocity_" + RIGHT_MTR, 0.15) + +def arm_code(): + arm_target_pos = ARM_DOWN_POS + while True: + # Get the current target position of the arm + if Keyboard.get_value(ARM_DOWN): + arm_target_pos = ARM_DOWN_POS + elif Keyboard.get_value(ARM_UP): + arm_target_pos = ARM_UP_POS + + # Drive the arm motor to go to the target position USING ENCODERS (think hard about how you can use this to your advantage!) + # Ask PiE staff what these do and refer to the student API! + current_pos = Robot.get_value(ARM_MOTOR_ID, "enc_" + ARM_MTR) # Retrieves current position of the arm motor + + # Sets motor going in the correct direction based on whether the arm is on one side or the other side of the target position + if current_pos < arm_target_pos: + Robot.set_value(ARM_MOTOR_ID, "velocity_" + ARM_MTR, ARM_SPEED) + elif current_pos > arm_target_pos: + Robot.set_value(ARM_MOTOR_ID, "velocity_" + ARM_MTR, ARM_SPEED * -1.0) + else: + Robot.set_value(ARM_MOTOR_ID, "velocity_" + ARM_MTR, 0.0) + +def teleop_setup(): + # Start the arm_code() function running simultaneously with teleop_main() + # Robot.run(arm_code) + pass + +def teleop_main(): + # Drive code + if Keyboard.get_value(LEFT_MOTOR_FORWARD): + Robot.set_value(MOTOR_ID, "velocity_" + LEFT_MTR, 1.0) + elif Keyboard.get_value(LEFT_MOTOR_BACKWARD): + Robot.set_value(MOTOR_ID, "velocity_" + LEFT_MTR, -1.0) + else: + Robot.set_value(MOTOR_ID, "velocity_" + LEFT_MTR, 0.0) + + if Keyboard.get_value(RIGHT_MOTOR_FORWARD): + Robot.set_value(MOTOR_ID, "velocity_" + RIGHT_MTR, 1.0) + elif Keyboard.get_value(RIGHT_MOTOR_BACKWARD): + Robot.set_value(MOTOR_ID, "velocity_" + RIGHT_MTR, -1.0) + else: + Robot.set_value(MOTOR_ID, "velocity_" + RIGHT_MTR, 0.0) + +`; diff --git a/renderer/consts/version.ts b/renderer/consts/version.ts new file mode 100644 index 00000000..7eeae224 --- /dev/null +++ b/renderer/consts/version.ts @@ -0,0 +1 @@ +export const VERSION = '3.0.0'; diff --git a/renderer/index.js b/renderer/index.tsx similarity index 61% rename from renderer/index.js rename to renderer/index.tsx index b307d160..6e13bb79 100644 --- a/renderer/index.js +++ b/renderer/index.tsx @@ -1,12 +1,12 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; -import App from './components/App'; -import store from './store'; +import { App } from './components/App'; +import { store } from './store'; ReactDOM.render( , - document.getElementById('content'), + document.getElementById('content') ); diff --git a/renderer/reducers/FieldStore.js b/renderer/reducers/FieldStore.js deleted file mode 100644 index 27918234..00000000 --- a/renderer/reducers/FieldStore.js +++ /dev/null @@ -1,57 +0,0 @@ -import { ActionTypes } from '../constants/Constants'; - -const initialFieldState = { - stationNumber: 4, - bridgeAddress: 'localhost', - fieldControl: false, - rTeamNumber: 0, - rTeamName: 'Unknown', - heart: false, - masterStatus: false, - mMatchNumber: 0, - mTeamNumbers: [0, 0, 0, 0], - mTeamNames: ['Offline', 'Offline', 'Offline', 'Offline'], - teamNumber: 0, - teamColor: 'Unknown', -}; - -const fieldStore = (state = initialFieldState, action) => { - switch (action.type) { - case ActionTypes.UPDATE_FC_CONFIG: - return { - ...state, - stationNumber: action.stationNumber, - bridgeAddress: action.bridgeAddress, - }; - case ActionTypes.FIELD_CONTROL: - return { - ...state, - fieldControl: action.fieldControl, - }; - case ActionTypes.UPDATE_HEART: - return { - ...state, - heart: !state.heart, - }; - case ActionTypes.UPDATE_MASTER: - return { - ...state, - masterStatus: true, - blueMaster: action.blueMaster, - goldMaster: action.goldMaster, - }; - case ActionTypes.UPDATE_MATCH: - return { - ...state, - mMatchNumber: action.matchNumber, - mTeamNumbers: action.teamNumbers, - mTeamNames: action.teamNames, - rTeamNumber: action.teamNumbers[state.stationNumber], - rTeamName: action.teamNames[state.stationNumber], - }; - default: - return state; - } -}; - -export default fieldStore; diff --git a/renderer/reducers/alerts.js b/renderer/reducers/alerts.js deleted file mode 100644 index a830d2a7..00000000 --- a/renderer/reducers/alerts.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Reducer from asynchronous alerts state data. - */ - -const asyncAlerts = (state = [], action) => { - switch (action.type) { - case 'ADD_ASYNC_ALERT': - return [ - ...state, - { - id: action.id, - heading: action.heading, - message: action.message, - }, - ]; - case 'REMOVE_ASYNC_ALERT': - return state.filter(el => el.id !== action.id); - default: - return state; - } -}; - -export default asyncAlerts; diff --git a/renderer/reducers/alerts.ts b/renderer/reducers/alerts.ts new file mode 100644 index 00000000..5e3b1544 --- /dev/null +++ b/renderer/reducers/alerts.ts @@ -0,0 +1,34 @@ +/** + * Reducer from asynchronous alerts state data. + */ + +import * as consts from '../consts'; +import { AddAsyncAlertAction, RemoveAsyncAlertAction } from '../types'; + +type Actions = AddAsyncAlertAction | RemoveAsyncAlertAction; + +type AsyncAlertsState = Array<{ + id?: number; + heading?: string; + message?: string; +}>; + +const initialState: AsyncAlertsState = []; + +export const asyncAlerts = (state: AsyncAlertsState = initialState, action: Actions) => { + switch (action.type) { + case consts.AlertActionsTypes.ADD_ASYNC_ALERT: + return [ + ...state, + { + id: action.id, + heading: action.heading, + message: action.message, + }, + ]; + case consts.AlertActionsTypes.REMOVE_ASYNC_ALERT: + return state.filter((el: { id?: number }) => el.id !== action.id); + default: + return state; + } +}; diff --git a/renderer/reducers/console.ts b/renderer/reducers/console.ts new file mode 100644 index 00000000..24713518 --- /dev/null +++ b/renderer/reducers/console.ts @@ -0,0 +1,50 @@ +/** + * Reducer for console state data + */ +import * as consts from '../consts'; +import { ClearConsoleAction, UpdateConsoleAction, ToggleConsoleAction, ToggleScrollAction } from '../types'; + +type Actions = ClearConsoleAction | ToggleConsoleAction | ToggleScrollAction | UpdateConsoleAction; + +interface ConsoleState { + showConsole: boolean; + consoleData: string[]; + disableScroll: boolean; + consoleUnread: boolean; +} + +const initialState = { + showConsole: false, + consoleData: [], + disableScroll: false, + consoleUnread: false, +}; + +export const console = (state: ConsoleState = initialState, action: Actions) => { + switch (action.type) { + case consts.ConsoleActionsTypes.UPDATE_CONSOLE: + return { + ...state, + consoleData: [...state.consoleData, ...action.consoleOutput], + consoleUnread: !state.showConsole, + }; + case consts.ConsoleActionsTypes.CLEAR_CONSOLE: + return { + ...state, + consoleData: [], + }; + case consts.ConsoleActionsTypes.TOGGLE_CONSOLE: + return { + ...state, + showConsole: !state.showConsole, + consoleUnread: false, + }; + case consts.ConsoleActionsTypes.TOGGLE_SCROLL: + return { + ...state, + disableScroll: !state.disableScroll, + }; + default: + return state; + } +}; diff --git a/renderer/reducers/dawnApp.js b/renderer/reducers/dawnApp.js deleted file mode 100644 index c6e06e5a..00000000 --- a/renderer/reducers/dawnApp.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Combining all the reducers into one and exporting it. - */ - -import { combineReducers } from 'redux'; - -import asyncAlerts from './alerts'; -import editor from './editor'; -import studentConsole from './studentConsole'; -import peripherals from './peripherals'; -import info from './info'; -import gamepads from './gamepads'; -import settings from './settings'; -import fieldStore from './FieldStore'; -import TimerStore from './TimerStore'; - -const dawnApp = combineReducers({ - asyncAlerts, - editor, - fieldStore, - studentConsole, - peripherals, - info, - gamepads, - settings, - TimerStore, -}); - -export default dawnApp; diff --git a/renderer/reducers/editor.js b/renderer/reducers/editor.js deleted file mode 100644 index 0d58f669..00000000 --- a/renderer/reducers/editor.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Reducer for editor state data. - */ - -const defaultEditorState = { - filepath: '', - latestSaveCode: '', - editorCode: '', -}; - -const editor = (state = defaultEditorState, action) => { - switch (action.type) { - case 'UPDATE_EDITOR': - return { - ...state, - editorCode: action.code, - }; - case 'OPEN_FILE_SUCCEEDED': - return { - ...state, - editorCode: action.code, - filepath: action.filepath, - latestSaveCode: action.code, - }; - case 'SAVE_FILE_SUCCEEDED': - return { - ...state, - filepath: action.filepath, - latestSaveCode: action.code, - }; - default: - return state; - } -}; - -export default editor; diff --git a/renderer/reducers/editor.ts b/renderer/reducers/editor.ts new file mode 100644 index 00000000..623f9a98 --- /dev/null +++ b/renderer/reducers/editor.ts @@ -0,0 +1,94 @@ +/** + * Reducer for editor state data. + */ +import * as consts from '../consts'; +import { + EditorUpdateAction, + OpenFileSucceededAction, + SaveFileSucceededAction, + OpenFileAction, + DragFileAction, + SaveFileAction, + DeleteFileAction, + CreateNewFileAction, + DownloadCodeAction, + UploadCodeAction, + UpdateIsKeyboardModeToggledAction, + UpdateKeyboardBitmapAction, + InitiateLatencyCheck, + SetLatencyValue +} from '../types'; + +type Actions = + | EditorUpdateAction + | OpenFileSucceededAction + | SaveFileSucceededAction + | OpenFileAction + | DragFileAction + | SaveFileAction + | DeleteFileAction + | CreateNewFileAction + | DownloadCodeAction + | UploadCodeAction + | UpdateIsKeyboardModeToggledAction + | UpdateKeyboardBitmapAction + | InitiateLatencyCheck + | SetLatencyValue; + +interface EditorState { + latencyValue: number; + filepath: string; + latestSaveCode: string; + editorCode: string; + keyboardBitmap: number; + isKeyboardModeToggled: boolean; +} + +const defaultEditorState = { + filepath: '', + latestSaveCode: '', + editorCode: '', + keyboardBitmap: 0, + isKeyboardModeToggled: false, + latencyValue: 0 +}; + +export const editor = (state: EditorState = defaultEditorState, action: Actions) => { + switch (action.type) { + case consts.EditorActionsTypes.UPDATE_EDITOR: + return { + ...state, + editorCode: action.code, + }; + case consts.EditorActionsTypes.OPEN_FILE_SUCCEEDED: + return { + ...state, + editorCode: action.code, + filepath: action.filepath, + latestSaveCode: action.code, + }; + case consts.EditorActionsTypes.SAVE_FILE_SUCCEEDED: + return { + ...state, + filepath: action.filepath, + latestSaveCode: action.code, + }; + case consts.EditorActionsTypes.UPDATE_KEYBOARD_BITMAP: + return { + ...state, + keyboardBitmap: action.keyboardBitmap, + }; + case consts.EditorActionsTypes.SET_LATENCY_VALUE: + return { + ...state, + latencyValue: action.latencyValue, + }; + case consts.EditorActionsTypes.UPDATE_IS_KEYBOARD_MODE_TOGGLED: + return { + ...state, + isKeyboardModeToggled: action.isKeyboardToggled, + }; + default: + return state; + } +}; diff --git a/renderer/reducers/fieldStore.ts b/renderer/reducers/fieldStore.ts new file mode 100644 index 00000000..9986e96d --- /dev/null +++ b/renderer/reducers/fieldStore.ts @@ -0,0 +1,92 @@ +import * as consts from '../consts'; +import { + UpdateTimerAction, + UpdateHeartAction, + UpdateMasterAction, + UpdateMatchAction, + UpdateRobotAction, + ToggleFieldControlAction, + UpdateFieldControlAction, +} from '../types'; + +type Actions = + | UpdateTimerAction + | UpdateHeartAction + | UpdateMasterAction + | UpdateMatchAction + | UpdateRobotAction + | ToggleFieldControlAction + | UpdateFieldControlAction; + +interface FieldState { + stationNumber: number; + bridgeAddress: string; + fieldControl: boolean; + rTeamNumber: number; + rTeamName: string; + heart: boolean; + masterStatus: boolean; + mMatchNumber: number; + mTeamNumbers: number[]; + mTeamNames: string[]; + teamNumber: number; + teamColor: string; + blueMasterTeamNumber: number; + goldMasterTeamNumber: number; +} + +const initialFieldState = { + stationNumber: 4, + bridgeAddress: 'localhost', + fieldControl: false, + rTeamNumber: 0, + rTeamName: 'Unknown', + heart: false, + masterStatus: false, + mMatchNumber: 0, + mTeamNumbers: [0, 0, 0, 0], + mTeamNames: ['Offline', 'Offline', 'Offline', 'Offline'], + teamNumber: 0, + teamColor: 'Unknown', + blueMasterTeamNumber: 0, + goldMasterTeamNumber: 0 +}; + +export const fieldStore = (state: FieldState = initialFieldState, action: Actions) => { + switch (action.type) { + case consts.FieldActionsTypes.UPDATE_FC_CONFIG: + return { + ...state, + stationNumber: action.stationNumber, + bridgeAddress: action.bridgeAddress, + }; + case consts.FieldActionsTypes.FIELD_CONTROL: + return { + ...state, + fieldControl: action.fieldControl, + }; + case consts.FieldActionsTypes.UPDATE_HEART: + return { + ...state, + heart: !state.heart, + }; + case consts.FieldActionsTypes.UPDATE_MASTER: + return { + ...state, + masterStatus: true, + blueMasterTeamNumber: action.blueMasterTeamNumber, + goldMasterTeamNumber: action.goldMasterTeamNumber, + }; + case consts.FieldActionsTypes.UPDATE_MATCH: + return { + ...state, + mMatchNumber: action.matchNumber, + mTeamNumbers: action.teamNumbers, + mTeamNames: action.teamNames, + rTeamNumber: action.teamNumbers[state.stationNumber], + rTeamName: action.teamNames[state.stationNumber], + }; + default: + return state; + } +}; diff --git a/renderer/reducers/gamepads.js b/renderer/reducers/gamepads.js deleted file mode 100644 index 224c6f7f..00000000 --- a/renderer/reducers/gamepads.js +++ /dev/null @@ -1,13 +0,0 @@ -const gamepads = (state = {}, action) => { - switch (action.type) { - case 'UPDATE_GAMEPADS': - return { - ...state, - gamepads: action.gamepads, - }; - default: - return state; - } -}; - -export default gamepads; diff --git a/renderer/reducers/gamepads.ts b/renderer/reducers/gamepads.ts new file mode 100644 index 00000000..605d4ec3 --- /dev/null +++ b/renderer/reducers/gamepads.ts @@ -0,0 +1,19 @@ +import * as consts from '../consts'; +import { UpdateGamepadsAction } from '../types'; +import { Input } from '../../protos/protos'; + +interface GamePadsState { + gamepads?: Input[]; +} + +export const gamepads = (state: GamePadsState = {}, action: UpdateGamepadsAction) => { + switch (action.type) { + case consts.GamepadsActionsTypes.UPDATE_GAMEPADS: + return { + ...state, + gamepads: action.gamepads, + }; + default: + return state; + } +}; diff --git a/renderer/reducers/info.js b/renderer/reducers/info.js deleted file mode 100644 index dddc0ce7..00000000 --- a/renderer/reducers/info.js +++ /dev/null @@ -1,83 +0,0 @@ -import { ipcRenderer } from 'electron'; -import { ActionTypes } from '../constants/Constants'; -import { robotState, runtimeState, defaults } from '../utils/utils'; - -const initialInfoState = { - ipAddress: defaults.IPADDRESS, - studentCodeStatus: robotState.IDLE, - robotState: runtimeState.STUDENT_STOPPED, - isRunningCode: false, - connectionStatus: false, - runtimeStatus: false, - masterStatus: false, - notificationHold: 0, - fieldControlDirective: robotState.TELEOP, - fieldControlActivity: false, -}; - -const info = (state = initialInfoState, action) => { - switch (action.type) { - case 'PER_MESSAGE': - return { - ...state, - connectionStatus: true, - robotState: action.robotState, - isRunningCode: (action.robotState === runtimeState.STUDENT_RUNNING || - action.robotState === runtimeState.TELEOP || - action.robotState === runtimeState.AUTONOMOUS), - }; - case 'ANSIBLE_DISCONNECT': - return { - ...state, - connectionStatus: false, - }; - case 'NOTIFICATION_CHANGE': - return { - ...state, - notificationHold: action.notificationHold, - }; - case 'RUNTIME_CONNECT': - return { - ...state, - runtimeStatus: true, - }; - case 'MASTER_ROBOT': - return { - ...state, - masterStatus: true, - }; - case 'RUNTIME_DISCONNECT': - return { - ...state, - runtimeStatus: false, - studentCodeStatus: robotState.IDLE, - }; - case 'CODE_STATUS': - ipcRenderer.send('studentCodeStatus', { studentCodeStatus: action.studentCodeStatus }); - return { - ...state, - studentCodeStatus: action.studentCodeStatus, - }; - case 'IP_CHANGE': - ipcRenderer.send('ipAddress', { ipAddress: action.ipAddress }); - return { - ...state, - ipAddress: action.ipAddress, - }; - case ActionTypes.UPDATE_ROBOT: { - const stateChange = (action.autonomous) ? robotState.AUTONOMOUS : robotState.TELEOP; - ipcRenderer.send('studentCodeStatus', { studentCodeStatus: (!action.enabled) ? robotState.IDLE : stateChange }); - return { - ...state, - fieldControlDirective: stateChange, - fieldControlActivity: action.enabled, - // eslint-disable-next-line no-nested-ternary - studentCodeStatus: (!action.enabled) ? robotState.IDLE : stateChange, - }; - } - default: - return state; - } -}; - -export default info; diff --git a/renderer/reducers/info.ts b/renderer/reducers/info.ts new file mode 100644 index 00000000..0395a5dc --- /dev/null +++ b/renderer/reducers/info.ts @@ -0,0 +1,123 @@ +import { ipcRenderer } from 'electron'; +import { robotState, defaults } from '../utils/utils'; +import * as consts from '../consts'; +import { + InfoPerMessageAction, + RuntimeConnectAction, + MasterStatusAction, + RuntimeDisconnectAction, + UpdateCodeStatusAction, + IpChangeAction, + UDPTunnelIpChangeAction, + SSHIpChangeAction, + UpdateRobotAction, + NotificationChangeAction, +} from '../types'; + +type Actions = + | InfoPerMessageAction + | RuntimeConnectAction + | MasterStatusAction + | RuntimeDisconnectAction + | UpdateCodeStatusAction + | IpChangeAction + | UDPTunnelIpChangeAction + | SSHIpChangeAction + | UpdateRobotAction + | NotificationChangeAction; + +interface InfoState { + ipAddress: string; + udpTunnelIpAddress: string; + sshAddress: string; + studentCodeStatus: number; + isRunningCode: boolean; + connectionStatus: boolean; + runtimeStatus: boolean; + masterStatus: boolean; + notificationHold: number; + fieldControlDirective: number; + fieldControlActivity: boolean; +} + +const initialInfoState = { + ipAddress: defaults.IPADDRESS, + udpTunnelIpAddress: defaults.IPADDRESS, + sshAddress: defaults.IPADDRESS, + studentCodeStatus: robotState.IDLE, + isRunningCode: false, + connectionStatus: false, + runtimeStatus: false, + masterStatus: false, + notificationHold: 0, + fieldControlDirective: robotState.TELEOP, + fieldControlActivity: false, +}; + +export const info = (state: InfoState = initialInfoState, action: Actions): InfoState => { + switch (action.type) { + case consts.InfoActionsTypes.PER_MESSAGE: + return { + ...state, + connectionStatus: true, + }; + case consts.InfoActionsTypes.NOTIFICATION_CHANGE: + return { + ...state, + notificationHold: action.notificationHold, + }; + case consts.InfoActionsTypes.RUNTIME_CONNECT: + return { + ...state, + runtimeStatus: true, + }; + case consts.InfoActionsTypes.RUNTIME_DISCONNECT: + return { + ...state, + runtimeStatus: false, + connectionStatus: false, + studentCodeStatus: robotState.IDLE, + }; + case consts.InfoActionsTypes.MASTER_ROBOT: + return { + ...state, + masterStatus: true, + }; + case consts.InfoActionsTypes.CODE_STATUS: + ipcRenderer.send('runModeUpdate', { mode: action.studentCodeStatus }); + return { + ...state, + studentCodeStatus: action.studentCodeStatus, + }; + case consts.InfoActionsTypes.IP_CHANGE: + ipcRenderer.send('ipAddress', action.ipAddress); + return { + ...state, + ipAddress: action.ipAddress, + }; + case consts.InfoActionsTypes.UDP_TUNNEL_IP_CHANGE: + ipcRenderer.send('udpTunnelIpAddress', action.ipAddress); + return { + ...state, + udpTunnelIpAddress: action.ipAddress + }; + case consts.InfoActionsTypes.SSH_IP_CHANGE: + return { + ...state, + sshAddress: action.ipAddress + } + case consts.FieldActionsTypes.UPDATE_ROBOT: { + const stateChange = (action.autonomous) ? robotState.AUTONOMOUS : robotState.TELEOP; + const codeStatus = (!action.enabled) ? robotState.IDLE : stateChange; + return { + ...state, + fieldControlDirective: stateChange, + fieldControlActivity: action.enabled, + // eslint-disable-next-line no-nested-ternary + studentCodeStatus: codeStatus, + }; + } + default: + return state; + } +}; diff --git a/renderer/reducers/peripherals.js b/renderer/reducers/peripherals.js deleted file mode 100644 index f5cf585d..00000000 --- a/renderer/reducers/peripherals.js +++ /dev/null @@ -1,63 +0,0 @@ -import { PeripheralTypes } from '../constants/Constants'; - -const initialPeripheralState = { - peripheralList: {}, - batterySafety: false, - batteryLevel: 0, - runtimeVersion: '0.0.0', -}; - -function getParams(peripheral) { - const res = {}; - peripheral.param_value.forEach((obj) => { - // eslint-disable-next-line prefer-destructuring - res[obj.param] = Object.values(obj)[0]; - }); - return res; -} - -const peripherals = (state = initialPeripheralState, action) => { - const nextState = Object.assign({}, state); - const nextPeripherals = nextState.peripheralList; - switch (action.type) { - case 'UPDATE_PERIPHERALS': { - const keys = []; - action.peripherals.forEach((peripheral) => { - if (peripheral.device_type === PeripheralTypes.BatteryBuzzer) { - const batteryParams = getParams(peripheral); - if (batteryParams.is_unsafe !== undefined) { - nextState.batterySafety = batteryParams.is_unsafe; - } - if (batteryParams.v_batt !== undefined) { - nextState.batteryLevel = batteryParams.v_batt; - } - } else if (peripheral.uid === '-1') { - const version = getParams(peripheral); - nextState.runtimeVersion = `${version.major}.${version.minor}.${version.patch}`; - } else { - keys.push(peripheral.uid); - if (peripheral.uid in nextPeripherals) { - peripheral.device_name = nextPeripherals[peripheral.uid].device_name; - } - nextPeripherals[peripheral.uid] = peripheral; - } - }); - Object.keys(nextPeripherals).forEach((el) => { - if (keys.indexOf(el) === -1) { - delete nextPeripherals[el]; - } - }); - return nextState; - } - // Note: This is not being used since NameEdit is still broken - case 'PERIPHERAL_RENAME': { - nextPeripherals[action.id].name = action.name; - return nextState; - } - default: { - return state; - } - } -}; - -export default peripherals; diff --git a/renderer/reducers/peripherals.ts b/renderer/reducers/peripherals.ts new file mode 100644 index 00000000..5ac4d2b1 --- /dev/null +++ b/renderer/reducers/peripherals.ts @@ -0,0 +1,69 @@ +import * as consts from '../consts'; +import { UpdatePeripheralsAction, PeripheralRenameAction, Peripheral, PeripheralList } from '../types'; + +type Actions = UpdatePeripheralsAction | PeripheralRenameAction; + +interface PeripheralState { + peripheralList: PeripheralList; + batterySafety: boolean; + batteryLevel: number; + runtimeVersion: string; +} + +const initialPeripheralState: PeripheralState = { + peripheralList: {}, + batterySafety: false, + batteryLevel: 0, + runtimeVersion: '1.0.0', +}; + +// Taken from runtime_util.c in Runtime repo +const IS_UNSAFE = 0; +const V_BATT = 5; + +// TODO: Handle runtimeVersion since no longer sent +export const peripherals = (state: PeripheralState = initialPeripheralState, action: Actions) => { + const nextState = Object.assign({}, state); + const nextPeripherals = nextState.peripheralList; + switch (action.type) { + case consts.PeripheralActionsTypes.UPDATE_PERIPHERALS: { + const keys: string[] = []; + + (action.peripherals ?? []).forEach((peripheral: Peripheral) => { + if (peripheral.name === consts.PeripheralTypes.BatteryBuzzer) { + const batteryParams = peripheral.params; + if (batteryParams[IS_UNSAFE] && batteryParams[IS_UNSAFE].bval) { + nextState.batterySafety = batteryParams[IS_UNSAFE].bval!; + } + if (batteryParams[V_BATT] && batteryParams[V_BATT].fval) { + nextState.batteryLevel = batteryParams[V_BATT].fval!; + } + } else { + const key = `${peripheral.type}_${peripheral.uid}`; + keys.push(key); + + if (key in nextPeripherals) { + peripheral.name = nextPeripherals[key].name; // ensures that the device keeps the name, if it was a custom name + } + nextPeripherals[key] = { ...peripheral, uid: key }; + } + }); + + Object.keys(nextPeripherals).forEach((uid: string) => { + if (keys.indexOf(uid) === -1) { + delete nextPeripherals[uid]; // Delete old devices + } + }); + + return nextState; + } + // Note: This is not being used since NameEdit is still broken + case consts.PeripheralActionsTypes.PERIPHERAL_RENAME: { + // nextPeripherals[action.id].name = action.name; + return nextState; + } + default: { + return state; + } + } +}; diff --git a/renderer/reducers/rootReducer.ts b/renderer/reducers/rootReducer.ts new file mode 100644 index 00000000..8024c1c7 --- /dev/null +++ b/renderer/reducers/rootReducer.ts @@ -0,0 +1,27 @@ +/** + * Combining all the reducers into one and exporting it. + */ + +import { combineReducers } from 'redux'; + +import { asyncAlerts } from './alerts'; +import { editor } from './editor'; +import { console } from './console'; +import { peripherals } from './peripherals'; +import { info } from './info'; +import { gamepads } from './gamepads'; +import { settings } from './settings'; +import { fieldStore } from './fieldStore'; +import { timerStore } from './timerStore'; + +export const rootReducer = combineReducers({ + asyncAlerts, + editor, + fieldStore, + console, + peripherals, + info, + gamepads, + settings, + timerStore, +}); diff --git a/renderer/reducers/settings.js b/renderer/reducers/settings.js deleted file mode 100644 index 8fb15acb..00000000 --- a/renderer/reducers/settings.js +++ /dev/null @@ -1,23 +0,0 @@ -const initialState = { - fontSize: 14, - editorTheme: 'tomorrow', -}; - -const settings = (state = initialState, action) => { - switch (action.type) { - case 'CHANGE_FONTSIZE': - return { - ...state, - fontSize: action.newFontsize, - }; - case 'CHANGE_THEME': - return { - ...state, - editorTheme: action.theme, - }; - default: - return state; - } -}; - -export default settings; diff --git a/renderer/reducers/settings.ts b/renderer/reducers/settings.ts new file mode 100644 index 00000000..20d395b8 --- /dev/null +++ b/renderer/reducers/settings.ts @@ -0,0 +1,31 @@ +import * as consts from '../consts'; +import { ChangeFontSizeAction, ChangeThemeAction } from '../types'; + +type Actions = ChangeFontSizeAction | ChangeThemeAction; + +interface SettingState { + fontSize: number; + editorTheme: string; +} + +const initialState = { + fontSize: 14, + editorTheme: 'tomorrow', +}; + +export const settings = (state: SettingState = initialState, action: Actions) => { + switch (action.type) { + case consts.SettingsActionsTypes.CHANGE_FONT_SIZE: + return { + ...state, + fontSize: action.newFontSize, + }; + case consts.SettingsActionsTypes.CHANGE_THEME: + return { + ...state, + editorTheme: action.theme, + }; + default: + return state; + } +}; diff --git a/renderer/reducers/studentConsole.js b/renderer/reducers/studentConsole.js deleted file mode 100644 index e5598d64..00000000 --- a/renderer/reducers/studentConsole.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Reducer for console state data - */ - -const initialState = { - showConsole: false, - consoleData: [], - disableScroll: false, - consoleUnread: false, -}; - -const studentConsole = (state = initialState, action) => { - switch (action.type) { - case 'UPDATE_CONSOLE': - return { - ...state, - consoleData: [ - ...state.consoleData, - action.consoleOutput, - ], - consoleUnread: !state.showConsole, - }; - case 'CLEAR_CONSOLE': - return { - ...state, - consoleData: [], - }; - case 'TOGGLE_CONSOLE': - return { - ...state, - showConsole: !state.showConsole, - consoleUnread: false, - }; - case 'TOGGLE_SCROLL': - return { - ...state, - disableScroll: !state.disableScroll, - }; - default: - return state; - } -}; - -export default studentConsole; diff --git a/renderer/reducers/TimerStore.js b/renderer/reducers/timerStore.ts similarity index 65% rename from renderer/reducers/TimerStore.js rename to renderer/reducers/timerStore.ts index 2621c468..f1f79692 100644 --- a/renderer/reducers/TimerStore.js +++ b/renderer/reducers/timerStore.ts @@ -1,16 +1,25 @@ -import { ActionTypes } from '../constants/Constants'; +import * as consts from '../consts'; +import { UpdateTimerAction } from '../types'; + +interface TimerState { + timestamp: number; + timeLeft: number; + computedTime: number; + totalTime: number; + stage: string; +} const initialTimerState = { timestamp: 0, timeLeft: 0, computedTime: 0, // TODO: Questionable if this should even be in the store totalTime: 0, - + stage: '', }; -const TimerStore = (state = initialTimerState, action) => { +export const timerStore = (state: TimerState = initialTimerState, action: UpdateTimerAction) => { switch (action.type) { - case ActionTypes.UPDATE_TIMER: + case consts.FieldActionsTypes.UPDATE_TIMER: return { ...state, timestamp: Date.now(), @@ -32,5 +41,3 @@ const TimerStore = (state = initialTimerState, action) => { // _timerData.computedTime = timeLeft; // } // setInterval(refreshTimer, 200); - -export default TimerStore; diff --git a/renderer/store.js b/renderer/store.ts similarity index 58% rename from renderer/store.js rename to renderer/store.ts index 18cf6438..94be8d90 100644 --- a/renderer/store.js +++ b/renderer/store.ts @@ -1,17 +1,15 @@ import { compose, createStore, applyMiddleware } from 'redux'; import createSagaMiddleware from 'redux-saga'; -import dawnApp from './reducers/dawnApp'; +import { rootReducer } from './reducers/rootReducer'; import rootSaga from './utils/sagas'; - const sagaMiddleware = createSagaMiddleware(); -const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; -const store = createStore( - dawnApp, +const composeEnhancers = window['__REDUX_DEVTOOLS_EXTENSION_COMPOSE__'] as typeof compose || compose; + +export const store = createStore( + rootReducer, composeEnhancers(applyMiddleware(sagaMiddleware)), ); sagaMiddleware.run(rootSaga); - -export default store; diff --git a/renderer/types/actions/alert-actions.ts b/renderer/types/actions/alert-actions.ts new file mode 100644 index 00000000..2a2ebc96 --- /dev/null +++ b/renderer/types/actions/alert-actions.ts @@ -0,0 +1,19 @@ +import * as consts from '../../consts'; + +export interface AddAsyncAlertAction { + type: consts.AlertActionsTypes.ADD_ASYNC_ALERT; + id: number; + heading: string; + message: string; +} + +export interface RemoveAsyncAlertAction { + type: consts.AlertActionsTypes.REMOVE_ASYNC_ALERT; + id: number; +} + +export interface AlertActions { + addAsyncAlert: (heading: string, message: string) => AddAsyncAlertAction; + + removeAsyncAlert: (id: number) => RemoveAsyncAlertAction; +} diff --git a/renderer/types/actions/console-actions.ts b/renderer/types/actions/console-actions.ts new file mode 100644 index 00000000..6eb24843 --- /dev/null +++ b/renderer/types/actions/console-actions.ts @@ -0,0 +1,28 @@ +import * as consts from '../../consts'; + +export interface UpdateConsoleAction { + type: consts.ConsoleActionsTypes.UPDATE_CONSOLE; + consoleOutput: string[]; +} + +export interface ClearConsoleAction { + type: consts.ConsoleActionsTypes.CLEAR_CONSOLE; +} + +export interface ToggleConsoleAction { + type: consts.ConsoleActionsTypes.TOGGLE_CONSOLE; +} + +export interface ToggleScrollAction { + type: consts.ConsoleActionsTypes.TOGGLE_SCROLL; +} + +export interface ConsoleActions { + updateConsole: (value: string[]) => UpdateConsoleAction; + + clearConsole: () => ClearConsoleAction; + + toggleConsole: () => ToggleConsoleAction; + + toggleScroll: () => ToggleScrollAction; +} diff --git a/renderer/types/actions/editor-actions.ts b/renderer/types/actions/editor-actions.ts new file mode 100644 index 00000000..1b3c630d --- /dev/null +++ b/renderer/types/actions/editor-actions.ts @@ -0,0 +1,97 @@ +import * as consts from '../../consts'; + +export interface EditorUpdateAction { + type: consts.EditorActionsTypes.UPDATE_EDITOR; + code: string; +} + +export interface OpenFileSucceededAction { + type: consts.EditorActionsTypes.OPEN_FILE_SUCCEEDED; + code: string; + filepath: string; +} + +export interface SaveFileSucceededAction { + type: consts.EditorActionsTypes.SAVE_FILE_SUCCEEDED; + code: string; + filepath: string; +} + +export interface OpenFileAction { + type: consts.EditorActionsTypes.OPEN_FILE; +} + +export interface DragFileAction { + type: consts.EditorActionsTypes.DRAG_FILE; + filepath: string; +} + +export interface SaveFileAction { + type: consts.EditorActionsTypes.SAVE_FILE; + saveAs: boolean; +} + +export interface DeleteFileAction { + type: consts.EditorActionsTypes.DELETE_FILE; +} + +export interface CreateNewFileAction { + type: consts.EditorActionsTypes.CREATE_NEW_FILE; +} + +export interface DownloadCodeAction { + type: consts.EditorActionsTypes.DOWNLOAD_CODE; +} + +export interface UploadCodeAction { + type: consts.EditorActionsTypes.UPLOAD_CODE; +} + +export interface UpdateKeyboardBitmapAction { + type: consts.EditorActionsTypes.UPDATE_KEYBOARD_BITMAP; + keyboardBitmap: number; +} + +export interface UpdateIsKeyboardModeToggledAction { + type: consts.EditorActionsTypes.UPDATE_IS_KEYBOARD_MODE_TOGGLED; + isKeyboardToggled: boolean; +} + +export interface InitiateLatencyCheck { + type: consts.EditorActionsTypes.INITIATE_LATENCY_CHECK; +} + +export interface SetLatencyValue { + type: consts.EditorActionsTypes.SET_LATENCY_VALUE; + latencyValue: number; +} + +export interface EditorActions { + editorUpdate: (newVal: string) => EditorUpdateAction; + + openFileSucceeded: (data: string, filepath: string) => OpenFileSucceededAction; + + saveFileSucceeded: (data: string, filepath: string) => SaveFileSucceededAction; + + openFile: () => OpenFileAction; + + dragFile: (filepath: string) => DragFileAction; + + saveFile: (saveAs?: boolean) => SaveFileAction; + + deleteFile: () => DeleteFileAction; + + createNewFile: () => CreateNewFileAction; + + downloadCode: () => DownloadCodeAction; + + uploadCode: () => UploadCodeAction; + + updateKeyboardBitmap: (keyboardBitmap: number) => UpdateKeyboardBitmapAction; + + updateIsKeyboardModeToggled: (isKeyboardToggled: boolean) => UpdateIsKeyboardModeToggledAction; + + initiateLatencyCheck: () => InitiateLatencyCheck; + + setLatencyValue: (latencyValue: number) => SetLatencyValue; +} diff --git a/renderer/types/actions/field-actions.ts b/renderer/types/actions/field-actions.ts new file mode 100644 index 00000000..c6064771 --- /dev/null +++ b/renderer/types/actions/field-actions.ts @@ -0,0 +1,58 @@ +import * as consts from '../../consts'; + +export interface UpdateTimerAction { + type: consts.FieldActionsTypes.UPDATE_TIMER; + timeLeft: number; + stage: string; + totalTime: number; +} + +export interface UpdateHeartAction { + type: consts.FieldActionsTypes.UPDATE_HEART; +} + +export interface UpdateMasterAction { + type: consts.FieldActionsTypes.UPDATE_MASTER; + blueMasterTeamNumber: number; + goldMasterTeamNumber: number; +} + +export interface UpdateMatchAction { + type: consts.FieldActionsTypes.UPDATE_MATCH; + matchNumber: number; + teamNames: string[]; + teamNumbers: number[]; +} + +export interface UpdateRobotAction { + type: consts.FieldActionsTypes.UPDATE_ROBOT; + autonomous: number; + enabled: boolean; +} + +export interface ToggleFieldControlAction { + type: consts.FieldActionsTypes.FIELD_CONTROL; + fieldControl: boolean; +} + +export interface UpdateFieldControlAction { + type: consts.FieldActionsTypes.UPDATE_FC_CONFIG; + stationNumber: number; + bridgeAddress: string; +} + +export interface FieldActions { + updateTimer: (msg: { total_stage_time: number; stage_time_so_far: number; stage_name: string }) => UpdateTimerAction; + + updateHeart: () => UpdateHeartAction; + + updateMaster: (msg: { blue: number; gold: number }) => UpdateMasterAction; + + updateMatch: (msg: { match_number: number; team_names: string[]; team_numbers: number[] }) => UpdateMatchAction; + + updateRobot: (msg: { autonomous: number; enabled: boolean }) => UpdateRobotAction; + + toggleFieldControl: (msg: boolean) => ToggleFieldControlAction; + + updateFieldControl: (msg: { stationNumber: number; bridgeAddress: string }) => UpdateFieldControlAction; +} diff --git a/renderer/types/actions/gamepads-actions.ts b/renderer/types/actions/gamepads-actions.ts new file mode 100644 index 00000000..552d1f58 --- /dev/null +++ b/renderer/types/actions/gamepads-actions.ts @@ -0,0 +1,11 @@ +import * as consts from '../../consts'; +import { Input } from "../../../protos/protos"; + +export interface UpdateGamepadsAction { + type: consts.GamepadsActionsTypes.UPDATE_GAMEPADS; + gamepads: Input[]; +} + +export interface GamepadsActions { + updateGamepads: (gamepads: Input[]) => UpdateGamepadsAction; +} diff --git a/renderer/types/actions/index.ts b/renderer/types/actions/index.ts new file mode 100644 index 00000000..86439197 --- /dev/null +++ b/renderer/types/actions/index.ts @@ -0,0 +1,44 @@ +export { AlertActions, AddAsyncAlertAction, RemoveAsyncAlertAction } from './alert-actions'; +export { ConsoleActions, ToggleConsoleAction, UpdateConsoleAction, ClearConsoleAction, ToggleScrollAction } from './console-actions'; +export { PeripheralActions, UpdatePeripheralsAction, PeripheralRenameAction } from './peripheral-actions'; +export { + EditorActions, + EditorUpdateAction, + OpenFileSucceededAction, + SaveFileSucceededAction, + OpenFileAction, + DragFileAction, + SaveFileAction, + DeleteFileAction, + CreateNewFileAction, + DownloadCodeAction, + InitiateLatencyCheck, + SetLatencyValue, + UploadCodeAction, + UpdateIsKeyboardModeToggledAction, + UpdateKeyboardBitmapAction +} from './editor-actions'; +export { GamepadsActions, UpdateGamepadsAction } from './gamepads-actions'; +export { SettingsActions, ChangeFontSizeAction, ChangeThemeAction } from './settings-actions'; +export { + FieldActions, + UpdateTimerAction, + UpdateHeartAction, + UpdateMasterAction, + UpdateMatchAction, + UpdateRobotAction, + ToggleFieldControlAction, + UpdateFieldControlAction, +} from './field-actions'; +export { + InfoActions, + InfoPerMessageAction, + RuntimeConnectAction, + MasterStatusAction, + RuntimeDisconnectAction, + UpdateCodeStatusAction, + IpChangeAction, + UDPTunnelIpChangeAction, + SSHIpChangeAction, + NotificationChangeAction, +} from './info-actions'; diff --git a/renderer/types/actions/info-actions.ts b/renderer/types/actions/info-actions.ts new file mode 100644 index 00000000..5e2a00ff --- /dev/null +++ b/renderer/types/actions/info-actions.ts @@ -0,0 +1,62 @@ +import * as consts from '../../consts'; + +export interface InfoPerMessageAction { + type: consts.InfoActionsTypes.PER_MESSAGE; +} + +export interface RuntimeConnectAction { + type: consts.InfoActionsTypes.RUNTIME_CONNECT; +} + +export interface RuntimeDisconnectAction { + type: consts.InfoActionsTypes.RUNTIME_DISCONNECT; +} + +export interface MasterStatusAction { + type: consts.InfoActionsTypes.MASTER_ROBOT; +} + +export interface UpdateCodeStatusAction { + type: consts.InfoActionsTypes.CODE_STATUS; + studentCodeStatus: number; +} + +export interface IpChangeAction { + type: consts.InfoActionsTypes.IP_CHANGE; + ipAddress: string; +} + +export interface UDPTunnelIpChangeAction { + type: consts.InfoActionsTypes.UDP_TUNNEL_IP_CHANGE; + ipAddress: string; +} + +export interface SSHIpChangeAction { + type: consts.InfoActionsTypes.SSH_IP_CHANGE; + ipAddress: string; +} + +export interface NotificationChangeAction { + type: consts.InfoActionsTypes.NOTIFICATION_CHANGE; + notificationHold: number; +} + +export interface InfoActions { + infoPerMessage: () => InfoPerMessageAction; + + runtimeConnect: () => RuntimeConnectAction; + + masterStatus: () => MasterStatusAction; + + runtimeDisconnect: () => RuntimeDisconnectAction; + + updateCodeStatus: (studentCodeStatus: number) => UpdateCodeStatusAction; + + ipChange: (ipAddress: string) => IpChangeAction; + + udpTunnelIpChange: (ipAddress: string) => UDPTunnelIpChangeAction; + + sshIpChange: (ipAddress: string) => SSHIpChangeAction; + + notificationChange: () => NotificationChangeAction; +} diff --git a/renderer/types/actions/peripheral-actions.ts b/renderer/types/actions/peripheral-actions.ts new file mode 100644 index 00000000..71cbdc92 --- /dev/null +++ b/renderer/types/actions/peripheral-actions.ts @@ -0,0 +1,19 @@ +import * as consts from '../../consts'; +import { Peripheral } from '../../types'; + +export interface UpdatePeripheralsAction { + type: consts.PeripheralActionsTypes.UPDATE_PERIPHERALS; + peripherals: Peripheral[]; +} + +export interface PeripheralRenameAction { + type: consts.PeripheralActionsTypes.PERIPHERAL_RENAME; + id: number; + name: string; +} + +export interface PeripheralActions { + updatePeripherals: (sensors: Peripheral[]) => UpdatePeripheralsAction; + + peripheralRename: (uid: number, newName: string) => PeripheralRenameAction; +} diff --git a/renderer/types/actions/settings-actions.ts b/renderer/types/actions/settings-actions.ts new file mode 100644 index 00000000..cdba3e91 --- /dev/null +++ b/renderer/types/actions/settings-actions.ts @@ -0,0 +1,17 @@ +import * as consts from '../../consts'; + +export interface ChangeFontSizeAction { + type: consts.SettingsActionsTypes.CHANGE_FONT_SIZE; + newFontSize: number; +} + +export interface ChangeThemeAction { + type: consts.SettingsActionsTypes.CHANGE_THEME; + theme: string; +} + +export interface SettingsActions { + changeFontSize: (newFontSize: number) => ChangeFontSizeAction; + + changeTheme: (theme: string) => ChangeThemeAction; +} diff --git a/renderer/types/app-state.d.ts b/renderer/types/app-state.d.ts new file mode 100644 index 00000000..88b5c749 --- /dev/null +++ b/renderer/types/app-state.d.ts @@ -0,0 +1 @@ +type ApplicationState = ReturnType; diff --git a/renderer/types/field-control-config.ts b/renderer/types/field-control-config.ts new file mode 100644 index 00000000..504ff28c --- /dev/null +++ b/renderer/types/field-control-config.ts @@ -0,0 +1,4 @@ +export interface FieldControlConfig { + stationNumber: number; + bridgeAddress: string; + } \ No newline at end of file diff --git a/renderer/types/index.ts b/renderer/types/index.ts new file mode 100644 index 00000000..ce0982f7 --- /dev/null +++ b/renderer/types/index.ts @@ -0,0 +1,3 @@ +export * from './actions'; +export { FieldControlConfig } from './field-control-config'; +export { Peripheral, PeripheralList } from './peripheral-list'; diff --git a/renderer/types/modules.d.ts b/renderer/types/modules.d.ts new file mode 100644 index 00000000..426006be --- /dev/null +++ b/renderer/types/modules.d.ts @@ -0,0 +1 @@ +declare module 'smalltalk'; \ No newline at end of file diff --git a/renderer/types/peripheral-list.ts b/renderer/types/peripheral-list.ts new file mode 100644 index 00000000..d8859fb0 --- /dev/null +++ b/renderer/types/peripheral-list.ts @@ -0,0 +1,20 @@ +import { Param } from '../../protos/protos'; + +/** This `Peripheral` type is separate from the Device proto. + * The main difference is the uid is a string to account for human readability of numbers and 64-bit Longs. + */ +export interface Peripheral { + /** Device name */ + name: string; + + /** Device uid */ + uid: string; + + /** Device type */ + type: number; + + /** Device params */ + params: Param[]; +} + +export type PeripheralList = { [uid: string]: Peripheral }; diff --git a/renderer/utils/sagas.js b/renderer/utils/sagas.ts similarity index 63% rename from renderer/utils/sagas.js rename to renderer/utils/sagas.ts index f8840ea7..18148219 100644 --- a/renderer/utils/sagas.js +++ b/renderer/utils/sagas.ts @@ -4,20 +4,19 @@ * Sagas use ES6 generator functions, which have the '*' in their declaration. */ -import fs from 'fs'; +import fs, { readFile, writeFile } from 'fs'; import _ from 'lodash'; -import { delay, eventChannel } from 'redux-saga'; -import { all, call, cps, fork, put, race, select, take, takeEvery } from 'redux-saga/effects'; -import { ipcRenderer, remote } from 'electron'; +import { eventChannel } from 'redux-saga'; +import { all, call, cps, delay, fork, put, race, select, take, takeEvery } from 'redux-saga/effects'; +import { Client } from 'ssh2'; +import { ipcRenderer, OpenDialogReturnValue, SaveDialogReturnValue, MessageBoxReturnValue, remote } from 'electron'; import { addAsyncAlert } from '../actions/AlertActions'; import { openFileSucceeded, saveFileSucceeded } from '../actions/EditorActions'; import { toggleFieldControl } from '../actions/FieldActions'; import { updateGamepads } from '../actions/GamepadsActions'; import { runtimeConnect, runtimeDisconnect } from '../actions/InfoActions'; import { TIMEOUT, defaults, logging } from '../utils/utils'; - - -const { Client } = require('ssh2'); +import { Input, Source, TimeStamps } from '../../protos/protos'; let timestamp = Date.now(); @@ -33,13 +32,16 @@ function openFileDialog() { return new Promise((resolve, reject) => { remote.dialog.showOpenDialog({ filters: [{ name: 'python', extensions: ['py'] }], - }, (filepaths) => { + }).then((openDialogReturnValue: OpenDialogReturnValue) => { + const { filePaths } = openDialogReturnValue; // If filepaths is undefined, the user did not specify a file. - if (filepaths === undefined) { + if (_.isEmpty(filePaths)) { reject(); } else { - resolve(filepaths[0]); + resolve(filePaths[0]); } + }).catch((error) => { + reject(error); }); }); } @@ -54,18 +56,19 @@ function saveFileDialog() { return new Promise((resolve, reject) => { remote.dialog.showSaveDialog({ filters: [{ name: 'python', extensions: ['py'] }], - }, (filepath) => { + }).then((saveDialogReturnValue: SaveDialogReturnValue) => { + const { filePath } = saveDialogReturnValue; // If filepath is undefined, the user did not specify a file. - if (filepath === undefined) { + if (filePath === undefined) { reject(); return; } // Automatically append .py extension if they don't have it - if (!filepath.endsWith('.py')) { - resolve(`${filepath}.py`); + if (!filePath.endsWith('.py')) { + resolve(`${filePath}.py`); } - resolve(filepath); + resolve(filePath); }); }); } @@ -76,7 +79,7 @@ function saveFileDialog() { * * @return {Promise} - fulfilled with button index. */ -function unsavedDialog(action) { +function unsavedDialog(action: string) { return new Promise((resolve, reject) => { remote.dialog.showMessageBox({ type: 'warning', @@ -84,14 +87,15 @@ function unsavedDialog(action) { title: 'You have unsaved changes!', message: `You are trying to ${action} a new file, but you have unsaved changes to your current one. What do you want to do?`, - }, (res) => { + }).then((messageBoxReturnValue: MessageBoxReturnValue) => { + const { response } = messageBoxReturnValue; // 'res' is an integer corrseponding to index in button list above. - if (res === 0 || res === 1 || res === 2) { - resolve(res); + if (response === 0 || response === 1 || response === 2) { + resolve(response); } else { reject(); } - }); + }) }); } @@ -99,17 +103,19 @@ your current one. What do you want to do?`, * Simple helper function to write to a codefile and dispatch action * notifying store of the save. */ -function* writeFile(filepath, code) { - yield cps(fs.writeFile, filepath, code); +function* writeCodeToFile(filepath: string, code: string): Generator { + yield cps([fs, writeFile], filepath, code); yield put(saveFileSucceeded(code, filepath)); } -const editorState = state => ({ +const editorState = (state: ApplicationState) => ({ filepath: state.editor.filepath, code: state.editor.editorCode, + keyboardBitmap: state.editor.keyboardBitmap, + isKeyboardModeToggled: state.editor.isKeyboardModeToggled }); -function* saveFile(action) { +function* saveFile(action: any) { const result = yield select(editorState); let { filepath } = result; const { code } = result; @@ -118,21 +124,21 @@ function* saveFile(action) { if (action.saveAs === true || !filepath) { try { filepath = yield call(saveFileDialog); - yield* writeFile(filepath, code); + yield* writeCodeToFile(filepath, code); } catch (e) { logging.log('No filename specified, file not saved.'); } } else { - yield* writeFile(filepath, code); + yield* writeCodeToFile(filepath, code); } } -const editorSavedState = state => ({ +const editorSavedState = (state: any) => ({ savedCode: state.editor.latestSaveCode, code: state.editor.editorCode, }); -function* openFile(action) { +function* openFile(action: any) { const type = (action.type === 'OPEN_FILE') ? 'open' : 'create'; const result = yield select(editorSavedState); let res = 1; @@ -148,21 +154,21 @@ function* openFile(action) { if (res === 0 || res === 1) { if (type === 'open') { try { - const filepath = yield call(openFileDialog); - const data = yield cps(fs.readFile, filepath, 'utf8'); - yield put(openFileSucceeded(data, filepath)); + const filepath: string = yield call(openFileDialog); + const data: Buffer = yield cps([fs, readFile], filepath); + yield put(openFileSucceeded(data.toString(), filepath)); } catch (e) { logging.log('No filename specified, no file opened.'); } } else if (type === 'create') { - yield put(openFileSucceeded('', null)); + yield put(openFileSucceeded('', '')); } } else { logging.log(`File ${type} canceled.`); } } -function* dragFile(action) { +function* dragFile(action: any) { const result = yield select(editorSavedState); let res = 1; // Refers to unsavedDialog choices if (result.code !== result.savedCode) { @@ -178,8 +184,8 @@ function* dragFile(action) { if (res === 0 || res === 1) { try { const { filepath } = action; - const data = yield cps(fs.readFile, filepath, 'utf8'); - yield put(openFileSucceeded(data, filepath)); + const data: Buffer = yield cps([fs, readFile], filepath); + yield put(openFileSucceeded(data.toString(), filepath)); } catch (e) { logging.log('Failure to Drag File In'); } @@ -192,7 +198,7 @@ function* dragFile(action) { * This saga acts as a "heartbeat" to check whether we are still receiving * updates from Runtime. * - * NOTE that this is different from whether or not the Ansible connection + * NOTE that this is different from whether or not the Runtime connection * is still alive. */ function* runtimeHeartbeat() { @@ -201,7 +207,7 @@ function* runtimeHeartbeat() { // runtime. Only the winner will have a value. const result = yield race({ update: take('PER_MESSAGE'), - timeout: call(delay, TIMEOUT), + timeout: delay(TIMEOUT) }); // If update wins, we assume we are connected, otherwise disconnected. @@ -213,11 +219,11 @@ function* runtimeHeartbeat() { } } -const _timestamps = [0, 0, 0, 0]; +const _timestamps: Array = [0, 0, 0, 0]; -function _needToUpdate(newGamepads) { +function _needToUpdate(newGamepads: (Gamepad | null)[]): boolean { return _.some(newGamepads, (gamepad, index) => { - if (gamepad != null && (gamepad.timestamp > _timestamps[index])) { + if (gamepad != null && (gamepad.timestamp > (_timestamps[index] ?? 0))) { _timestamps[index] = gamepad.timestamp; return true; } else if (gamepad == null && _timestamps[index] != null) { @@ -228,72 +234,128 @@ function _needToUpdate(newGamepads) { }); } -function formatGamepads(newGamepads) { - const formattedGamepads = {}; +function formatGamepads(newGamepads: (Gamepad | null)[]): Input[] { + let formattedGamepads: Input[] = []; // Currently there is a bug on windows where navigator.getGamepads() // returns a second, 'ghost' gamepad even when only one is connected. // The filter on 'mapping' filters out the ghost gamepad. - _.forEach(_.filter(newGamepads, { mapping: 'standard' }), (gamepad, indexGamepad) => { + _.forEach(_.filter(newGamepads, { mapping: 'standard' }), (gamepad: Gamepad | null, indexGamepad: number) => { if (gamepad) { - formattedGamepads[indexGamepad] = { - index: indexGamepad, - axes: gamepad.axes, - buttons: _.map(gamepad.buttons, 'value'), - }; + let bitmap: number = 0; + gamepad.buttons.forEach((button, index) => { + if (button.pressed) { + bitmap |= (1 << index); + } + }); + formattedGamepads[indexGamepad] = new Input({ + connected: gamepad.connected, + axes: gamepad.axes.slice(), + buttons: bitmap, + source: Source.GAMEPAD + }); } }); return formattedGamepads; } +function* initiateLatencyCheck() { + while (true) { + const time: number = Date.now(); + const timestamps = new TimeStamps({ + dawnTimestamp: time, + runtimeTimestamp: 0 + }); + + ipcRenderer.send('initiateLatencyCheck', timestamps); + + yield delay(5000); + } + +} +/* + Send an update to Runtime indicating whether keyboard mode is on/off +*/ +function* sendKeyboardConnectionStatus() { + const currEditorState = yield select(editorState); + + const keyboardConnectionStatus = new Input({ + connected: currEditorState.isKeyboardModeToggled, + axes: [], + buttons: 0, + source: Source.KEYBOARD + }); + + ipcRenderer.send('stateUpdate', [keyboardConnectionStatus], Source.KEYBOARD); +} + +function* sendKeyboardInputs() { + const currEditorState = yield select(editorState); + + const keyboard = new Input({ + connected: true, + axes: [], + buttons: currEditorState.keyboardBitmap, + source: Source.KEYBOARD + }); + + ipcRenderer.send('stateUpdate', [keyboard], Source.KEYBOARD); +} + /** - * Repeatedly grab gamepad data, send it over Ansible to the robot, and dispatch + * Repeatedly grab gamepad data, send it over Runtime to the robot, and dispatch * redux action to update gamepad state. */ -function* ansibleGamepads() { - while (true) { - // navigator.getGamepads always returns a reference to the same object. This - // confuses redux, so we use assignIn to clone to a new object each time. - const newGamepads = Array.prototype.slice.call(navigator.getGamepads()); - if (_needToUpdate(newGamepads) || Date.now() - timestamp > 100) { - const formattedGamepads = formatGamepads(newGamepads); - yield put(updateGamepads(formattedGamepads)); - - // Send gamepad data to Runtime over Ansible. - if (_.some(newGamepads) || Date.now() - timestamp > 100) { - timestamp = Date.now(); - yield put({ type: 'UPDATE_MAIN_PROCESS' }); +function* runtimeGamepads() { + + const currEditorState = yield select(editorState) + + if (!currEditorState.isKeyboardModeToggled) { + while (true) { + // navigator.getGamepads always returns a reference to the same object. This + // confuses redux, so we use assignIn to clone to a new object each time. + const newGamepads = navigator.getGamepads(); + if (_needToUpdate(newGamepads) || Date.now() - timestamp > 100) { + const formattedGamepads = formatGamepads(newGamepads); + yield put(updateGamepads(formattedGamepads)); + + // Send gamepad data to Runtime. + if (_.some(newGamepads) || Date.now() - timestamp > 100) { + timestamp = Date.now(); + yield put({ type: 'UPDATE_MAIN_PROCESS' }); + } } - } - yield call(delay, 50); // wait 50 ms before updating again. + yield delay(50); // wait 50 ms before updating again. + } } } /** - * Creates the ansibleReceiver eventChannel, which emits + * Creates the runtimeReceiver eventChannel, which emits * data received from the main process. */ -function ansibleReceiver() { +function runtimeReceiver() { return eventChannel((emitter) => { - const listener = (event, action) => { + const listener = (_event: any, action: any) => { emitter(action); }; // Suscribe listener to dispatches from main process. - ipcRenderer.on('dispatch', listener); + ipcRenderer.on('reduxDispatch', listener); // Return an unsuscribe function. return () => { - ipcRenderer.removeListener('dispatch', listener); + ipcRenderer.removeListener('reduxDispatch', listener); }; }); } /** - * Takes data from the ansibleReceiver channel and dispatches + * Takes data from the runtimeReceiver channel and dispatches * it to the store */ -function* ansibleSaga() { +function* runtimeSaga() { try { - const chan = yield call(ansibleReceiver); + const chan = yield call(runtimeReceiver); + while (true) { const action = yield take(chan); // dispatch the action @@ -304,22 +366,19 @@ function* ansibleSaga() { } } -const gamepadsState = state => ({ - studentCodeStatus: state.info.studentCodeStatus, - gamepads: state.gamepads.gamepads, -}); +const gamepadsState = (state: any) => state.gamepads.gamepads; /** * Send the store to the main process whenever it changes. */ function* updateMainProcess() { - const stateSlice = yield select(gamepadsState); - ipcRenderer.send('stateUpdate', stateSlice); + const stateSlice = yield select(gamepadsState); // Get gamepads from Redux state store + ipcRenderer.send('stateUpdate', stateSlice, Source.GAMEPAD); } function* restartRuntime() { const conn = new Client(); - const stateSlice = yield select(state => ({ + const stateSlice = yield select((state: any) => ({ runtimeStatus: state.info.runtimeStatus, ipAddress: state.info.ipAddress, })); @@ -328,12 +387,12 @@ function* restartRuntime() { conn.on('ready', () => { conn.exec( 'sudo systemctl restart runtime.service', - { pty: true }, (uperr, stream) => { + { pty: true }, (uperr: any, stream: any) => { if (uperr) { resolve(1); } stream.write(`${defaults.PASSWORD}\n`); - stream.on('exit', (code) => { + stream.on('exit', (code: any) => { logging.log(`Runtime Restart: Returned ${code}`); conn.end(); resolve(0); @@ -341,7 +400,7 @@ function* restartRuntime() { }, ); }).connect({ - debug: (inpt) => { + debug: (inpt: any) => { logging.log(inpt); }, host: stateSlice.ipAddress, @@ -361,10 +420,18 @@ function* restartRuntime() { function* downloadStudentCode() { const conn = new Client(); - const stateSlice = yield select(state => ({ + const stateSlice = yield select((state: any) => ({ runtimeStatus: state.info.runtimeStatus, - ipAddress: state.info.ipAddress, + ipAddress: state.info.sshAddress, })); + let port = defaults.PORT; + let ip = stateSlice.ipAddress; + if (ip.includes(':')) { + const split = ip.split(':'); + ip = split[0]; + port = Number(split[1]); + } + console.log(`SSHing into ${ip}:${port} to download code`); const path = `${require('electron').remote.app.getPath('desktop')}/Dawn`; // eslint-disable-line global-require try { fs.statSync(path); @@ -374,20 +441,20 @@ function* downloadStudentCode() { if (stateSlice.runtimeStatus) { logging.log(`Downloading to ${path}`); const errors = yield call(() => new Promise((resolve) => { - conn.on('error', (err) => { + conn.on('error', (err: any) => { logging.log(err); resolve(3); }); conn.on('ready', () => { - conn.sftp((err, sftp) => { + conn.sftp((err: any, sftp: any) => { if (err) { logging.log(err); resolve(1); } sftp.fastGet( defaults.STUDENTCODELOC, `${path}/robotCode.py`, - (err2) => { + (err2: any) => { if (err2) { logging.log(err2); resolve(2); @@ -397,19 +464,19 @@ function* downloadStudentCode() { ); }); }).connect({ - debug: (inpt) => { + debug: (inpt: any) => { logging.log(inpt); }, - host: stateSlice.ipAddress, - port: defaults.PORT, + host: ip, + port: port, username: defaults.USERNAME, password: defaults.PASSWORD, }); })); switch (errors) { case 0: { - const data = yield cps(fs.readFile, `${path}/robotCode.py`, 'utf8'); - yield put(openFileSucceeded(data, `${path}/robotCode.py`)); + const data: Buffer = yield cps(fs.readFile, `${path}/robotCode.py`); + yield put(openFileSucceeded(data.toString(), `${path}/robotCode.py`)); yield put(addAsyncAlert( 'Download Success', 'File Downloaded Successfully', @@ -453,28 +520,35 @@ function* downloadStudentCode() { function* uploadStudentCode() { const conn = new Client(); - const stateSlice = yield select(state => ({ + const stateSlice = yield select((state: any) => ({ runtimeStatus: state.info.runtimeStatus, - ipAddress: state.info.ipAddress, + ipAddress: state.info.sshAddress, filepath: state.editor.filepath, })); + let port = defaults.PORT; + let ip = stateSlice.ipAddress; + if (ip.includes(':')) { + const split = ip.split(':'); + ip = split[0]; + port = Number(split[1]); + } if (stateSlice.runtimeStatus) { logging.log(`Uploading ${stateSlice.filepath}`); const errors = yield call(() => new Promise((resolve) => { - conn.on('error', (err) => { + conn.on('error', (err: any) => { logging.log(err); resolve(3); }); conn.on('ready', () => { - conn.sftp((err, sftp) => { + conn.sftp((err: any, sftp: any) => { if (err) { logging.log(err); resolve(1); } sftp.fastPut( stateSlice.filepath, defaults.STUDENTCODELOC, - (err2) => { + (err2: any) => { if (err2) { logging.log(err2); resolve(2); @@ -484,11 +558,11 @@ function* uploadStudentCode() { ); }); }).connect({ - debug: (input) => { + debug: (input: any) => { logging.log(input); }, - host: stateSlice.ipAddress, - port: defaults.PORT, + host: ip, + port: port, username: defaults.USERNAME, password: defaults.PASSWORD, }); @@ -538,7 +612,7 @@ function* uploadStudentCode() { } function* handleFieldControl() { - const stateSlice = yield select(state => ({ + const stateSlice = yield select((state: any) => ({ fieldControlStatus: state.fieldStore.fieldControl, })); if (stateSlice.fieldControlStatus) { @@ -555,7 +629,6 @@ function timestampBounceback() { ipcRenderer.send('TIMESTAMP_SEND'); } - /** * The root saga combines all the other sagas together into one. */ @@ -571,9 +644,12 @@ export default function* rootSaga() { takeEvery('UPLOAD_CODE', uploadStudentCode), takeEvery('TOGGLE_FIELD_CONTROL', handleFieldControl), takeEvery('TIMESTAMP_CHECK', timestampBounceback), + takeEvery('UPDATE_KEYBOARD_BITMAP', sendKeyboardInputs), + takeEvery('UPDATE_IS_KEYBOARD_MODE_TOGGLED', sendKeyboardConnectionStatus), fork(runtimeHeartbeat), - fork(ansibleGamepads), - fork(ansibleSaga), + fork(runtimeGamepads), + fork(runtimeSaga), + fork(initiateLatencyCheck) ]); } @@ -589,6 +665,6 @@ export { runtimeHeartbeat, gamepadsState, updateMainProcess, - ansibleReceiver, - ansibleSaga, + runtimeReceiver, + runtimeSaga, }; // for tests diff --git a/renderer/utils/test/sagas.test.js b/renderer/utils/test/sagas.test.js index ef00ec03..10497447 100644 --- a/renderer/utils/test/sagas.test.js +++ b/renderer/utils/test/sagas.test.js @@ -17,8 +17,8 @@ import { runtimeHeartbeat, gamepadsState, updateMainProcess, - ansibleReceiver, - ansibleSaga, + runtimeReceiver, + runtimeSaga, } from '../sagas'; import fromGenerator from './redux-saga-test'; import { TIMEOUT } from '../../utils/utils'; @@ -138,11 +138,11 @@ describe('runtime sagas', () => { expect.next().select(gamepadsState); }); - it('should take data from ansibleReceiver and dispatch to store', () => { - const expect = fromGenerator(assert, ansibleSaga()); - expect.next().call(ansibleReceiver); + it('should take data from runtimeReceiver and dispatch to store', () => { + const expect = fromGenerator(assert, runtimeSaga()); + expect.next().call(runtimeReceiver); /* cannot test ipcRenderer for is undefined in test env - const chan = ansibleReceiver(); + const chan = runtimeReceiver(); expect.next(chan).take(chan); expect.next({ type: "SOME_ACTION" diff --git a/renderer/utils/utils.js b/renderer/utils/utils.ts similarity index 71% rename from renderer/utils/utils.js rename to renderer/utils/utils.ts index 55b8885d..e7732dd1 100644 --- a/renderer/utils/utils.js +++ b/renderer/utils/utils.ts @@ -1,8 +1,9 @@ +import { app, remote } from 'electron'; import fs from 'fs'; export const TIMEOUT = 5000; -export const pathToName = (filepath) => { +export const pathToName = (filepath: string) => { if (filepath !== null && filepath !== '') { if (process.platform === 'win32') { return filepath.split('\\').pop(); @@ -13,13 +14,16 @@ export const pathToName = (filepath) => { }; const IPV4_REGEX = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$/; -export const getValidationState = (testIPAddress) => { +export const getValidationState = (testIPAddress: string) => { if (IPV4_REGEX.test(testIPAddress)) { return 'success'; } if (testIPAddress === 'localhost') { return 'warning'; } + if (defaults.NGROK) { + return 'warning'; // Don't care about regex for ngrok IPs + } return 'error'; }; @@ -31,13 +35,15 @@ export const uploadStatus = { export const robotState = { IDLE: 0, - SIMSTR: 'Simulation', - TELEOP: 1, - TELEOPSTR: 'Tele-Operated', - AUTONOMOUS: 2, + IDLESTR: 'Idle', + 0: 'Idle', + AUTONOMOUS: 1, AUTOSTR: 'Autonomous', - ESTOP: 3, - ESTOPSTR: 'ESTOP', + 1: 'Autonomous', + TELEOP: 2, + TELEOPSTR: 'Tele-Operated', + 2: 'Tele-Operated', + SIMSTR: 'Simulation', }; // TODO: Synchronize this and the above state @@ -52,16 +58,15 @@ export const runtimeState = { 3: 'Tele-Operated', AUTONOMOUS: 4, 4: 'Autonomous', - ESTOP: 5, - 5: 'E-Stop', }; export const defaults = { PORT: 22, USERNAME: 'pi', PASSWORD: 'raspberry', - IPADDRESS: '192.168.0.2', - STUDENTCODELOC: './storage/studentcode.py', + IPADDRESS: '192.168.0.0', + STUDENTCODELOC: '/home/pi/runtime/executor/studentcode.py', + NGROK: true, }; export const timings = { @@ -81,12 +86,14 @@ export const windowInfo = { }; export class Logger { - constructor(processname, firstline) { + log_file: fs.WriteStream; + lastStr: string; + + constructor(processname: string, firstline: string) { let path; if (processname === 'dawn') { - path = require('electron').remote.app.getPath('desktop'); // eslint-disable-line global-require + path = remote.app.getPath('desktop'); } else { - const { app } = require('electron'); // eslint-disable-line global-require path = app.getPath('desktop'); } try { @@ -97,29 +104,28 @@ export class Logger { this.log_file = fs.createWriteStream(`${path}/Dawn/${processname}.log`, { flags: 'a' }); this.log_file.write(`\n${firstline}`); this.lastStr = ''; - this._write = this._write.bind(this); } - log(output) { + log = (output: string) => { console.log(output); this._write(output, `\n[${(new Date()).toString()}]`); } - debug(output) { + debug = (output: string) => { this._write(output, `\n[${(new Date()).toString()} DEBUG]`); } - _write(output, prefix) { + _write = (output: string, prefix: string) => { output = String(output); if (output !== this.lastStr) { this.log_file.write(`${prefix} ${output}`); this.lastStr = output; } else { - this.log_file.write('*'); + // this.log_file.write('*'); } } } -export let logging; // eslint-disable-line import/no-mutable-exports +export let logging: Logger; // eslint-disable-line import/no-mutable-exports export const startLog = () => { logging = new Logger('dawn', 'Renderer Debug'); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..5a1b46c2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "incremental": true, + "allowJs": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "jsx": "react", + "target": "ES6", + "moduleResolution": "node", + "esModuleInterop": true, + "noErrorTruncation": true, + "noUnusedParameters": true, + "strictPropertyInitialization": false, + "suppressImplicitAnyIndexErrors": true, + "noUnusedLocals": true, + "skipLibCheck": true, + "outDir": "./build", + "strict": true, + "experimentalDecorators": true, + "lib": [ + "es2017", + "dom" + ], + "plugins": [ + { + "name": "typescript-styled-plugin" + } + ] + }, + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/webpack.config.babel.js b/webpack.config.babel.js index d256cf91..3eb90a3d 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -1,12 +1,28 @@ -import path from 'path'; +import * as path from 'path'; const modules = { rules: [ { - test: /\.js$/, + test: /\.css$/, + use: ['style-loader', 'css-loader'], + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: ['file-loader'], + }, + { + test: /\.(ts|tsx)?$/, exclude: /node_modules/, + use: [{ loader: 'ts-loader' }] + }, + { + test: /\.js$/, + exclude: [/node_modules/, /protos/], enforce: 'pre', loader: 'eslint-loader', + options: { + formatter: require('eslint/lib/cli-engine/formatters/stylish') + }, }, { test: /\.js$/, @@ -18,8 +34,11 @@ const modules = { export default [ { - entry: './renderer/index.js', + entry: './renderer/index.tsx', devtool: 'cheap-module-eval-source-map', + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, output: { path: path.join(__dirname, 'build'), filename: 'bundle.js', @@ -28,7 +47,10 @@ export default [ module: modules, }, { - entry: './main/main-process.js', + entry: './main/main-process.ts', + resolve: { + extensions: ['.tsx', '.ts', '.js'], + }, output: { path: path.join(__dirname, 'build'), filename: 'main.js', diff --git a/yarn.lock b/yarn.lock index 1a2ad984..423d98b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,31 @@ # yarn lockfile v1 -"7zip@0.0.6": - version "0.0.6" - resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" - integrity sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA= +"@babel/code-frame@^7.0.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.9.4": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.11.tgz#9ce3595bcd74bc5c466905e86c535b8b25011e79" + integrity sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg== "@babel/runtime@^7.1.2": version "7.4.3" @@ -14,6 +35,37 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + +"@cloudcmd/create-element@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@cloudcmd/create-element/-/create-element-2.0.2.tgz#071b26cafafe4a79cdd056d05dee4bb6ac1a2271" + integrity sha512-5b74qCgwEUx+GxzXC9Gwamgh4Rx5ouLSrCW+QbaBHWpxA5s1sw5i6MbSODfuts1MSX5RoaZjJAjNY5y3et1iXw== + dependencies: + currify "^4.0.0" + fullstore "^3.0.0" + +"@electron/get@^1.0.1", "@electron/get@^1.6.0": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.2.tgz#6442066afb99be08cefb9a281e4b4692b33764f3" + integrity sha512-vAuHUbfvBQpYTJ5wB7uVIDq5c/Ry0fiTBMs7lnEYAo/qXXppIVcWdfBr57u6eRnKdVso7KSiH6p/LbQAG6Izrg== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + sanitize-filename "^1.6.2" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^2.0.2" + global-tunnel-ng "^2.7.1" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -80,54 +132,540 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= +"@redux-saga/core@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4" + integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg== + dependencies: + "@babel/runtime" "^7.6.3" + "@redux-saga/deferred" "^1.1.2" + "@redux-saga/delay-p" "^1.1.2" + "@redux-saga/is" "^1.1.2" + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + redux "^4.0.4" + typescript-tuple "^2.2.1" + +"@redux-saga/deferred@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888" + integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ== + +"@redux-saga/delay-p@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355" + integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g== + dependencies: + "@redux-saga/symbols" "^1.1.2" + +"@redux-saga/is@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e" + integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w== + dependencies: + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + +"@redux-saga/symbols@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d" + integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ== + +"@redux-saga/types@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" + integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + "@tootallnate/once@1": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.0.0.tgz#9c13c2574c92d4503b005feca8f2e16cc1611506" - integrity sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@types/color-name@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" + integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== + +"@types/electron-devtools-installer@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.0.tgz#32ee4ebbe99b3daf9847a6d2097dc00b5de94f10" + integrity sha512-HJNxpaOXuykCK4rQ6FOMxAA0NLFYsf7FiPFGmab0iQmtVBHSAfxzy3MRFpLTTDDWbV0yD2YsHOQvdu8yCqtCfw== -"@types/long@^4.0.0": +"@types/electron-json-storage@^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef" - integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q== + resolved "https://registry.yarnpkg.com/@types/electron-json-storage/-/electron-json-storage-4.0.0.tgz#ea15cb3f2ca6fa4c31e74d974e0ec5655c74414f" + integrity sha512-b1+VXOjCPENmXhV0q41NCsJIFwpIjPfuJk++h53O4dQhb2RBZYEMTuAnu/UC+0+PhvmysT1f5WNt8RHM3vGevA== + dependencies: + electron "^1.7.5" + +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/glob@^7.1.1": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" + integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/json-schema@^7.0.3": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd" + integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ== + +"@types/json-schema@^7.0.5": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/keymirror@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@types/keymirror/-/keymirror-0.1.1.tgz#1fe48e6e5e2a969cafecf0f24485ae23c72abd30" + integrity sha1-H+SObl4qlpyv7PDyRIWuI8cqvTA= + +"@types/lodash@^4.14.159": + version "4.14.159" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.159.tgz#61089719dc6fdd9c5cb46efc827f2571d1517065" + integrity sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg== + +"@types/long@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.1.tgz#459c65fa1867dafe6a8f322c4c51695663cc55e9" + integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w== + +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + +"@types/node@*": + version "14.0.23" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" + integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== + +"@types/node@^12.0.12": + version "12.12.54" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.54.tgz#a4b58d8df3a4677b6c08bfbc94b7ad7a7a5f82d1" + integrity sha512-ge4xZ3vSBornVYlDnk7yZ0gK6ChHf/CHB7Gl1I0Jhah8DDnEQqBzgohYG4FX4p81TNirSETOiSyn+y1r9/IR6w== + +"@types/node@^13.7.0": + version "13.13.40" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.40.tgz#f655ef327362cc83912f2e69336ddc62a24a9f88" + integrity sha512-eKaRo87lu1yAXrzEJl0zcJxfUMDT5/mZalFyOkT44rnQps41eS2pfWzbaulSPpQLFNy29bFqn+Y5lOTL8ATlEQ== + +"@types/node@^14.0.14": + version "14.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.14.tgz#24a0b5959f16ac141aeb0c5b3cd7a15b7c64cbce" + integrity sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ== + +"@types/node@^8.0.24": + version "8.10.62" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.62.tgz#8d0d0db44a46ae7679d92e2e36d41bf1c3625d6a" + integrity sha512-76fupxOYVxk36kb7O/6KtrAPZ9jnSK3+qisAX4tQMEuGNdlvl7ycwatlHqjoE6jHfVtXFM3pCrCixZOidc5cuw== + +"@types/numeral@^0.0.28": + version "0.0.28" + resolved "https://registry.yarnpkg.com/@types/numeral/-/numeral-0.0.28.tgz#e43928f0bda10b169b6f7ecf99e3ddf836b8ebe4" + integrity sha512-Sjsy10w6XFHDktJJdXzBJmoondAKW+LcGpRFH+9+zXEDj0cOH8BxJuZA9vUDSMAzU1YRJlsPKmZEEiTYDlICLw== + +"@types/prop-types@*": + version "15.7.3" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" + integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + +"@types/react-bootstrap@^0.32.22": + version "0.32.22" + resolved "https://registry.yarnpkg.com/@types/react-bootstrap/-/react-bootstrap-0.32.22.tgz#26a1a5a95ce46759672c56168b46de9e759d89c6" + integrity sha512-pjUVcJzogMxns3lbvMqnnU+I8EOYxl3aI13tS2vvRm0RdAe1rs7Ds/VZA29GI6p8p3Un6NqKUpW3+dgwAjyzxg== + dependencies: + "@types/react" "*" + +"@types/react-dom@^16.9.8": + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== + dependencies: + "@types/react" "*" + +"@types/react-joyride@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/react-joyride/-/react-joyride-2.0.5.tgz#621fb90418a392ac009ee6b75c3d1850a88ea92b" + integrity sha512-N3bd0w3D42gZRpXy/wYsSZ8JvhyuyN0qAFTkg2iNsJ1NueMqfI0TJL+BZhhFkAqNhEETJEpDc8t4bj3DEJyLoQ== + dependencies: + react-joyride "*" -"@types/node@^10.1.0", "@types/node@^10.12.18": - version "10.14.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.4.tgz#1c586b991457cbb58fef51bc4e0cfcfa347714b5" - integrity sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg== +"@types/react-redux@^7.1.9": + version "7.1.9" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.9.tgz#280c13565c9f13ceb727ec21e767abe0e9b4aec3" + integrity sha512-mpC0jqxhP4mhmOl3P4ipRsgTgbNofMRXJb08Ms6gekViLj61v1hOZEKWDCyWsdONr6EjEA6ZHXC446wdywDe0w== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + +"@types/react@*": + version "16.9.46" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.46.tgz#f0326cd7adceda74148baa9bff6e918632f5069e" + integrity sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" + +"@types/react@^16.9.43": + version "16.9.43" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.43.tgz#c287f23f6189666ee3bebc2eb8d0f84bcb6cdb6b" + integrity sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg== + dependencies: + "@types/prop-types" "*" + csstype "^2.2.0" + +"@types/seedrandom@^2.4.28": + version "2.4.28" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f" + integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA== + +"@types/socket.io-client@^1.4.33": + version "1.4.33" + resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.33.tgz#8e705b9b3f7fba6cb329d27cd2eda222812adbf1" + integrity sha512-m4LnxkljsI9fMsjwpW5QhRpMixo2BeeLpFmg0AE+sS4H1pzAd/cs/ftTiL60FLZgfFa8PFRPx5KsHu8O0bADKQ== + +"@types/ssh2-streams@*": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.7.tgz#bf79349ec85a4dfb5b3fd9f4a05af729121f07e6" + integrity sha512-cQNV72C+BOG7G8WNGarTQdB2Ii37cJlWatSpx5zTYxtI2ZvUt2lbq6Nc2XZ4kbge28V7Xe5KYYr82d96/rDMnQ== + dependencies: + "@types/node" "*" + +"@types/ssh2@^0.5.44": + version "0.5.44" + resolved "https://registry.yarnpkg.com/@types/ssh2/-/ssh2-0.5.44.tgz#8bda3ffe9cab038a997f6749df76cc52249d1916" + integrity sha512-2aKqF0no055Zs8E6eaUtgDJv9yw1ViR7GLkWhuMIMnSPIU46vJJviEFZZtEqGxZEnrPpYxvOPPpWzwll/a4YwQ== + dependencies: + "@types/node" "*" + "@types/ssh2-streams" "*" + +"@types/yauzl@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" + integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.0.tgz#0f91aa3c83d019591719e597fbdb73a59595a263" + integrity sha512-4OEcPON3QIx0ntsuiuFP/TkldmBGXf0uKxPQlGtS/W2F3ndYm8Vgdpj/woPJkzUc65gd3iR+qi3K8SDQP/obFg== + dependencies: + "@typescript-eslint/experimental-utils" "3.7.0" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.0.tgz#0ee21f6c48b2b30c63211da23827725078d5169a" + integrity sha512-xpfXXAfZqhhqs5RPQBfAFrWDHoNxD5+sVB5A46TF58Bq1hRfVROrWHcQHHUM9aCBdy9+cwATcvCbRg8aIRbaHQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.7.0" + "@typescript-eslint/typescript-estree" "3.7.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/experimental-utils@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.8.0.tgz#ac1f7c88322dcfb7635ece6f0441516dd951099a" + integrity sha512-o8T1blo1lAJE0QDsW7nSyvZHbiDzQDjINJKyB44Z3sSL39qBy5L10ScI/XwDtaiunoyKGLiY9bzRk4YjsUZl8w== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/typescript-estree" "3.8.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.8.0.tgz#8e1dcd404299bf79492409c81c415fa95a7c622b" + integrity sha512-u5vjOBaCsnMVQOvkKCXAmmOhyyMmFFf5dbkM3TIbg3MZ2pyv5peE4gj81UAbTHwTOXEwf7eCQTUMKrDl/+qGnA== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "3.8.0" + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/typescript-estree" "3.8.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/types@3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.0.tgz#09897fab0cb95479c01166b10b2c03c224821077" + integrity sha512-reCaK+hyKkKF+itoylAnLzFeNYAEktB0XVfSQvf0gcVgpz1l49Lt6Vo9x4MVCCxiDydA0iLAjTF/ODH0pbfnpg== + +"@typescript-eslint/types@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.8.0.tgz#58581dd863f86e0cd23353d94362bb90b4bea796" + integrity sha512-8kROmEQkv6ss9kdQ44vCN1dTrgu4Qxrd2kXr10kz2NP5T8/7JnEfYNxCpPkArbLIhhkGLZV3aVMplH1RXQRF7Q== + +"@typescript-eslint/typescript-estree@3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.0.tgz#66872e6da120caa4b64e6b4ca5c8702afc74738d" + integrity sha512-xr5oobkYRebejlACGr1TJ0Z/r0a2/HUf0SXqPvlgUMwiMqOCu/J+/Dr9U3T0IxpE5oLFSkqMx1FE/dKaZ8KsOQ== + dependencies: + "@typescript-eslint/types" "3.7.0" + "@typescript-eslint/visitor-keys" "3.7.0" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/typescript-estree@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.8.0.tgz#0606d19f629f813dbdd5a34c7a1e895d6191cac6" + integrity sha512-MTv9nPDhlKfclwnplRNDL44mP2SY96YmPGxmMbMy6x12I+pERcxpIUht7DXZaj4mOKKtet53wYYXU0ABaiXrLw== + dependencies: + "@typescript-eslint/types" "3.8.0" + "@typescript-eslint/visitor-keys" "3.8.0" + debug "^4.1.1" + glob "^7.1.6" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@3.7.0": + version "3.7.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.0.tgz#ac0417d382a136e4571a0b0dcfe52088cb628177" + integrity sha512-k5PiZdB4vklUpUX4NBncn5RBKty8G3ihTY+hqJsCdMuD0v4jofI5xuqwnVcWxfv6iTm2P/dfEa2wMUnsUY8ODw== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/visitor-keys@3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.8.0.tgz#ad35110249fb3fc30a36bfcbfeea93e710cfaab1" + integrity sha512-gfqQWyVPpT9NpLREXNR820AYwgz+Kr1GuF3nf1wxpHD6hdxI62tq03ToomFnDxY0m3pUB39IF7sil7D5TQexLA== + dependencies: + eslint-visitor-keys "^1.1.0" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== - dependencies: - acorn "^5.0.0" +ace-builds@^1.4.12, ace-builds@^1.4.6: + version "1.4.12" + resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.4.12.tgz#888efa386e36f4345f40b5233fcc4fe4c588fae7" + integrity sha512-G+chJctFPiiLGvs3+/Mly3apXTcfgE45dT5yp12BcWZ1kUs+gm0qd3/fv4gsz6fVag4mM0moHVpjHDIgph6Psg== -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" +acorn-jsx@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" + integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^5.0.0, acorn@^5.5.0: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" + integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== after@0.8.2: version "0.8.2" @@ -140,33 +678,28 @@ agent-base@5: integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== agent-base@6: - version "6.0.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" - integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" + integrity sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg== dependencies: debug "4" -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.5.5: +ajv@^6.1.0: version "6.10.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== @@ -176,6 +709,41 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.0, ajv@^6.10.2: + version "6.12.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" + integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.3: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.4: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -201,18 +769,31 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== +ansi-regex@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +ansi-styles@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" + integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== + dependencies: + "@types/color-name" "^1.1.1" + color-convert "^2.0.1" + ansi-styles@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" @@ -223,11 +804,6 @@ any-observable@^0.2.0: resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" integrity sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI= -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -236,6 +812,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -249,6 +833,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -346,19 +935,17 @@ asap@~2.0.3: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asar@^0.14.0: - version "0.14.6" - resolved "https://registry.yarnpkg.com/asar/-/asar-0.14.6.tgz#0e56ff7fad97470845391c3a2b8690b7cabef6d8" - integrity sha512-ZqybKcdO5At6y3ge2RHxVImc6Eltb2t3sxT7lk4T4zjZBSFUuIGCIZY6f41dCjlvJSizN5QPRr8YTgMhpgBjLg== +asar@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" + integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== dependencies: chromium-pickle-js "^0.2.0" - commander "^2.9.0" - cuint "^0.2.1" - glob "^6.0.4" - minimatch "^3.0.3" - mkdirp "^0.5.0" - mksnapshot "^0.3.4" - tmp "0.0.28" + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + optionalDependencies: + "@types/glob" "^7.1.1" asn1.js@^4.0.0: version "4.10.1" @@ -413,6 +1000,11 @@ ast-types@0.11.3: resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.3.tgz#c20757fe72ee71278ea0ff3d87e5c2ca30d9edf8" integrity sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA== +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + async-each@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" @@ -440,6 +1032,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -456,9 +1053,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== axobject-query@^0.1.0: version "0.1.0" @@ -467,7 +1064,7 @@ axobject-query@^0.1.0: dependencies: ast-types-flow "0.0.7" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -1274,11 +1871,6 @@ base64-arraybuffer@0.1.5: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= -base64-js@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - integrity sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE= - base64-js@^1.0.2, base64-js@^1.2.3: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" @@ -1297,7 +1889,7 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcrypt-pbkdf@^1.0.0: +bcrypt-pbkdf@^1.0.0, bcrypt-pbkdf@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= @@ -1330,32 +1922,16 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -binary@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" +binary-extensions@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== binaryextensions@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.1.2.tgz#c83c3d74233ba7674e4f313cb2a2b70f54e94b7c" integrity sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg== -bindings@~1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" - integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== - -bl@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" - integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== - dependencies: - readable-stream "^2.3.5" - safe-buffer "^5.1.1" - blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" @@ -1366,11 +1942,21 @@ bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.4.tgz#d6cc661595de30d5b3af5fcedd3c0b3ef6ec5714" integrity sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw== +bluebird@^3.5.5, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +boolean@^3.0.0, boolean@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.1.tgz#35ecf2b4a2ee191b0b44986f14eb5f052a5cbb4f" + integrity sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1379,16 +1965,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.0.tgz#155cd80607687dc8cb908f0df94e62a033c1d563" - integrity sha1-FVzYBgdofcjLkI8N+U5ioDPB1WM= - -brace@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" - integrity sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg= - braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" @@ -1414,6 +1990,13 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -1533,11 +2116,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - bufferutil@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" @@ -1574,6 +2152,27 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1602,27 +2201,33 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-keys@^2.0.0: version "2.1.0" @@ -1642,6 +2247,11 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + caniuse-lite@^1.0.30000792: version "1.0.30000957" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000957.tgz#fb1026bf184d7d62c685205358c3b24b9e29f7b3" @@ -1652,6 +2262,13 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +catharsis@^0.8.11: + version "0.8.11" + resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.8.11.tgz#d0eb3d2b82b7da7a3ce2efb1a7b00becc6643468" + integrity sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g== + dependencies: + lodash "^4.17.14" + chai@4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" @@ -1664,13 +2281,6 @@ chai@4.1.2: pathval "^1.0.0" type-detect "^4.0.0" -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1682,7 +2292,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1691,6 +2301,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4 escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" @@ -1715,10 +2333,10 @@ check-error@^1.0.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -chokidar@^2.0.2: - version "2.1.5" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" - integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== dependencies: anymatch "^2.0.0" async-each "^1.0.1" @@ -1734,21 +2352,43 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.2.7" +chokidar@^3.4.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -chrome-trace-event@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" - integrity sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A== +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" chromium-pickle-js@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1757,11 +2397,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -1812,9 +2447,9 @@ cli-truncate@^0.2.1: string-width "^1.0.1" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== cliui@^3.2.0: version "3.2.0" @@ -1830,7 +2465,7 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-response@1.0.2: +clone-response@1.0.2, clone-response@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= @@ -1866,20 +2501,15 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= codecov@^3.0.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.6.5.tgz#d73ce62e8a021f5249f54b073e6f2d6a513f172a" - integrity sha512-v48WuDMUug6JXwmmfsMzhCHRnhUf8O3duqXvltaYJKrO1OekZWpB/eH6iIoaxMl8Qli0+u3OxptdsBOYiD7VAQ== + version "3.7.1" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.7.1.tgz#434cb8d55f18ef01672e5739d3d266696bebc202" + integrity sha512-JHWxyPTkMLLJn9SmKJnwAnvY09kg2Os2+Ux+GG7LwZ9g8gzDDISpIN5wAsH1UBaafA/yGcd3KofMaorE8qd6Lw== dependencies: argv "0.0.2" ignore-walk "3.0.3" @@ -1902,11 +2532,23 @@ color-convert@^1.9.0: dependencies: color-name "1.1.3" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -1918,9 +2560,9 @@ colors@^1.1.2: integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -1934,11 +2576,26 @@ commander@^2.11.0, commander@^2.9.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +comment-parser@^0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-0.7.5.tgz#06db157a3b34addf8502393743e41897e2c73059" + integrity sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1959,6 +2616,11 @@ component-emitter@1.2.1, component-emitter@^1.2.0, component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= +component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" @@ -1969,7 +2631,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: +concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1979,6 +2641,14 @@ concat-stream@1.6.2, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^ readable-stream "^2.2.2" typedarray "^0.0.6" +config-chain@^1.1.11: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -2040,6 +2710,11 @@ core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== +core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== + core-js@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" @@ -2090,7 +2765,7 @@ create-react-class@15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" -cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -2110,10 +2785,14 @@ cross-spawn@^6.0.4, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-unzip@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/cross-unzip/-/cross-unzip-0.0.2.tgz#5183bc47a09559befcf98cc4657964999359372f" - integrity sha1-UYO8R6CVWb78+YzEZXlkmZNZNy8= +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" crypto-browserify@^3.11.0: version "3.12.0" @@ -2132,10 +2811,38 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" -cuint@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= +css-loader@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" + integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.1" + semver "^7.3.2" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csstype@^2.2.0: + version "2.6.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5" + integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw== + +csstype@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" + integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== currently-unhandled@^0.4.1: version "0.4.1" @@ -2144,10 +2851,10 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" -currify@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/currify/-/currify-2.0.6.tgz#86064386778e315c043382d53ba278efc6a9ef87" - integrity sha512-F0lbcoBkA2FMcejFeHJkDEhQ1AvVkTpkn9PMzJch+7mHy5WdteZ9t+nhT6cOdga4uRay3rjvprgp8tUkixFy8w== +currify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/currify/-/currify-4.0.0.tgz#54637df9a9752de8a0d59efbfb5ce59384a1e306" + integrity sha512-ABfH28PWp5oqqp31cLXJQdeMqoFNej9rJOu84wKhN3jPCH7FAZg3zY1MVI27PTFoqfPlxOyhGmh9PzOVv+yN2g== cyclist@~0.2.2: version "0.2.2" @@ -2186,13 +2893,6 @@ dateformat@^2.0.0: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= -debug@2.6.9, debug@^2.0.0, debug@^2.1.0, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -2200,14 +2900,21 @@ debug@3.1.0, debug@~3.1.0: dependencies: ms "2.0.0" -debug@4: +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -debug@^3.0.0, debug@^3.1.0: +debug@^2.0.0, debug@^2.1.0, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -2231,18 +2938,10 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -decompress-zip@0.3.x: - version "0.3.2" - resolved "https://registry.yarnpkg.com/decompress-zip/-/decompress-zip-0.3.2.tgz#f3fa2841666abce394604f4a9e8a7085c202d464" - integrity sha512-Ab1QY4LrWMrUuo53lLnmGOby7v8ryqxJ+bKibKSiPisx+25mhut1dScVBXAYx14i/PqSrFZvR2FRRazhLbvL+g== - dependencies: - binary "^0.3.0" - graceful-fs "^4.1.3" - mkpath "^0.1.0" - nopt "^3.0.1" - q "^1.1.2" - readable-stream "^1.1.8" - touch "0.0.3" +deep-diff@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-1.0.2.tgz#afd3d1f749115be965e89c63edc7abb1506b9c26" + integrity sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg== deep-eql@^3.0.0: version "3.0.1" @@ -2261,12 +2960,22 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2: +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -2330,6 +3039,16 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +detect-node@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + +diff-match-patch@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37" + integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw== + diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" @@ -2345,6 +3064,11 @@ diff@^3.3.0, diff@^3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2370,13 +3094,20 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0, doctrine@^2.1.0: +doctrine@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + dom-helpers@^3.2.0, dom-helpers@^3.2.1, dom-helpers@^3.3.1: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" @@ -2435,30 +3166,29 @@ ejs@^2.3.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== -electron-devtools-installer@2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-2.2.4.tgz#261a50337e37121d338b966f07922eb4939a8763" - integrity sha512-b5kcM3hmUqn64+RUcHjjr8ZMpHS2WJ5YO0pnG9+P/RTdx46of/JrEjuciHWux6pE+On6ynWhHJF53j/EDJN0PA== +electron-devtools-installer@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/electron-devtools-installer/-/electron-devtools-installer-3.1.1.tgz#7b56c8c86475c5e4e10de6917d150c53c9ceb55e" + integrity sha512-g2D4J6APbpsiIcnLkFMyKZ6bOpEJ0Ltcc2m66F7oKUymyGAt628OWeU9nRZoh1cNmUs/a6Cls2UfOmsZtE496Q== dependencies: - "7zip" "0.0.6" - cross-unzip "0.0.2" - rimraf "^2.5.2" - semver "^5.3.0" + rimraf "^3.0.2" + semver "^7.2.1" + unzip-crx-3 "^0.2.0" -electron-download@^4.0.0, electron-download@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8" - integrity sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg== +electron-download@^3.0.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8" + integrity sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg= dependencies: - debug "^3.0.0" - env-paths "^1.0.0" - fs-extra "^4.0.1" + debug "^2.2.0" + fs-extra "^0.30.0" + home-path "^1.0.1" minimist "^1.2.0" - nugget "^2.0.1" - path-exists "^3.0.0" - rc "^1.2.1" - semver "^5.4.1" - sumchecker "^2.0.2" + nugget "^2.0.0" + path-exists "^2.1.0" + rc "^1.1.2" + semver "^5.3.0" + sumchecker "^1.2.0" electron-json-storage@4.0.2: version "4.0.2" @@ -2471,10 +3201,18 @@ electron-json-storage@4.0.2: rimraf "^2.5.1" rwlock "^5.0.0" -electron-osx-sign@^0.4.1: - version "0.4.11" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz#8377732fe7b207969f264b67582ee47029ce092f" - integrity sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ== +electron-notarize@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" + integrity sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og== + dependencies: + debug "^4.1.1" + fs-extra "^9.0.1" + +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" + integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== dependencies: bluebird "^3.5.0" compare-version "^0.1.2" @@ -2483,42 +3221,50 @@ electron-osx-sign@^0.4.1: minimist "^1.2.0" plist "^3.0.1" -electron-packager@^10.1.1: - version "10.1.2" - resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-10.1.2.tgz#a2308d14f63c321a089294f322fe0d51190bfd7c" - integrity sha1-ojCNFPY8MhoIkpTzIv4NURkL/Xw= - dependencies: - asar "^0.14.0" - debug "^3.0.0" - electron-download "^4.0.0" - electron-osx-sign "^0.4.1" - extract-zip "^1.0.3" - fs-extra "^5.0.0" +electron-packager@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.2.0.tgz#c93de19d75e7c03d159a56295384d371cb625ad4" + integrity sha512-BaklTBRQy1JTijR3hi8XxHf/uo76rHbDCNM/eQHSblzE9C0NoNfOe86nPxB7y1u2jwlqoEJ4zFiHpTFioKGGRA== + dependencies: + "@electron/get" "^1.6.0" + asar "^3.0.0" + debug "^4.0.1" + electron-notarize "^1.0.0" + electron-osx-sign "^0.5.0" + extract-zip "^2.0.0" + filenamify "^4.1.0" + fs-extra "^9.0.0" + galactus "^0.2.1" get-package-info "^1.0.0" - mz "^2.6.0" - nodeify "^1.0.1" + junk "^3.1.0" parse-author "^2.0.0" - pify "^3.0.0" - plist "^2.0.0" - pruner "^0.0.7" - rcedit "^0.9.0" + plist "^3.0.0" + rcedit "^2.0.0" resolve "^1.1.6" - sanitize-filename "^1.6.0" - semver "^5.3.0" - yargs-parser "^8.0.0" + semver "^7.1.3" + yargs-parser "^20.0.0" electron-to-chromium@^1.3.30: version "1.3.124" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz#861fc0148748a11b3e5ccebdf8b795ff513fa11f" integrity sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w== -electron@>=1.7.16: - version "4.1.4" - resolved "https://registry.yarnpkg.com/electron/-/electron-4.1.4.tgz#41ba9e041f38c25c62a7db806884410654df058f" - integrity sha512-MelOjntJvd33izEjR6H4N/Uii7y535z/b2BuYXJGLNSHL6o1IlyhUQmfiT87kWABayERgeuYERgvsyf956OOFw== +electron@>=7.2.4: + version "10.1.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-10.1.2.tgz#30b6fd7669f8daf08c56219a61dfa053fa2b0c70" + integrity sha512-SvN8DcKCmPZ0UcQSNAJBfaUu+LGACqtRhUn1rW0UBLHgdbbDM76L0GU5/XGQEllH5pu5bwlCZwax3srzIl+Aeg== dependencies: - "@types/node" "^10.12.18" - electron-download "^4.1.0" + "@electron/get" "^1.0.1" + "@types/node" "^12.0.12" + extract-zip "^1.0.3" + +electron@^1.7.5: + version "1.8.8" + resolved "https://registry.yarnpkg.com/electron/-/electron-1.8.8.tgz#a90cddb075291f49576993e6f5c8bb4439301cae" + integrity sha512-1f9zJehcTTGjrkb06o6ds+gsRq6SYhZJyxOk6zIWjRH8hVy03y/RzUDELzNas71f5vcvXmfGVvyjeEsadDI8tg== + dependencies: + "@types/node" "^8.0.24" + electron-download "^3.0.1" extract-zip "^1.0.3" elegant-spinner@^1.0.1: @@ -2544,17 +3290,32 @@ emoji-regex@^6.1.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" integrity sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" @@ -2563,15 +3324,15 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -engine.io-client@~3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" - integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== +engine.io-client@~3.4.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.3.tgz#192d09865403e3097e3575ebfeb3861c4d01a66c" + integrity sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw== dependencies: - component-emitter "1.2.1" + component-emitter "~1.3.0" component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" has-cors "1.1.0" indexof "0.0.1" parseqs "0.0.5" @@ -2580,10 +3341,10 @@ engine.io-client@~3.3.1: xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== +engine.io-parser@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed" + integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w== dependencies: after "0.8.2" arraybuffer.slice "~0.0.7" @@ -2600,10 +3361,31 @@ enhanced-resolve@^4.0.0: memory-fs "^0.4.0" tapable "^1.0.0" -env-paths@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" - integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA= +enhanced-resolve@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +entities@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" + integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== + +env-paths@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" + integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== errlop@^1.1.1: version "1.1.1" @@ -2655,10 +3437,15 @@ es-to-primitive@^1.2.0: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.1.1: - version "4.2.6" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" - integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== +es6-error@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +es6-promise@^4.0.5: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== es6-promise@~3.0.2: version "3.0.2" @@ -2670,6 +3457,16 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-config-airbnb-base@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" @@ -2684,7 +3481,14 @@ eslint-config-airbnb@16.1.0: dependencies: eslint-config-airbnb-base "^12.1.0" -eslint-import-resolver-node@^0.3.1, eslint-import-resolver-node@^0.3.2: +eslint-config-prettier@^6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" + integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== + dependencies: + get-stdin "^6.0.0" + +eslint-import-resolver-node@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" integrity sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q== @@ -2703,7 +3507,7 @@ eslint-loader@2.0.0: object-hash "^1.1.4" rimraf "^2.6.1" -eslint-module-utils@^2.1.1, eslint-module-utils@^2.3.0: +eslint-module-utils@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz#546178dab5e046c8b562bbb50705e2456d7bda49" integrity sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w== @@ -2727,21 +3531,18 @@ eslint-plugin-import@2.8.0: minimatch "^3.0.3" read-pkg-up "^2.0.0" -eslint-plugin-import@^2.8.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz#97ac3e75d0791c4fac0e15ef388510217be7f66f" - integrity sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A== +eslint-plugin-jsdoc@^30.2.1: + version "30.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.2.1.tgz#6cac1a70ec239b4672888193d8a4e084a7e2d7bf" + integrity sha512-9Nx+BKMBoCTDRIbVpMV4MYfw+lvfnfsWTWYX9vwRRZrkXBpZkKtE3dsFcG6MhF7N/vW1cwpjEnoAIAtn0+a6gw== dependencies: - contains-path "^0.1.0" - debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.3.0" - has "^1.0.3" - lodash "^4.17.11" - minimatch "^3.0.4" - read-pkg-up "^2.0.0" - resolve "^1.9.0" + comment-parser "^0.7.5" + debug "^4.1.1" + jsdoctypeparser "^9.0.0" + lodash "^4.17.19" + regextras "^0.7.1" + semver "^7.3.2" + spdx-expression-parse "^3.0.1" eslint-plugin-jsx-a11y@6.0.3: version "6.0.3" @@ -2756,6 +3557,18 @@ eslint-plugin-jsx-a11y@6.0.3: emoji-regex "^6.1.0" jsx-ast-utils "^2.0.0" +eslint-plugin-prettier@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" + integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz#8c229c268d468956334c943bb45fc860280f5556" + integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== + eslint-plugin-react@7.5.1: version "7.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz#52e56e8d80c810de158859ef07b880d2f56ee30b" @@ -2771,81 +3584,96 @@ eslint-restricted-globals@^0.1.1: resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" integrity sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc= -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== - -eslint@4.18.2: - version "4.18.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" - integrity sha512-qy4i3wODqKMYfz9LUI8N2qYDkHkoieTbiHpMrYUI/WbjhXJQr7lI4VngixTgaG+yHX+NBCv7nW4hA0ShbvaNKw== - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" +eslint-scope@^5.0.0, eslint-scope@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" + integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.5.0.tgz#9ecbfad62216d223b82ac9ffea7ef3444671d135" + integrity sha512-vlUP10xse9sWt9SGRtcr1LAC67BENcQMFeV+w5EvLEoFe3xJ8cF1Skd0msziRx/VMC+72B4DxreCE+OR12OA6Q== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.2.0" + esquery "^1.2.0" esutils "^2.0.2" - file-entry-cache "^2.0.0" + file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" + is-glob "^4.0.0" + js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" + optionator "^0.9.1" progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" -espree@^3.5.2: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== +espree@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" + integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" + acorn "^7.3.1" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.3.0" esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -2854,15 +3682,20 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.0.0: version "3.0.0" @@ -2890,6 +3723,11 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +exenv@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha1-KueOhdmJQVhnCwPUe+wfA72Ru50= + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -2922,11 +3760,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expand-template@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" - integrity sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg== - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -2963,7 +3796,7 @@ external-editor@^1.1.0: spawn-sync "^1.0.15" tmp "^0.0.29" -external-editor@^2.0.4, external-editor@^2.1.0: +external-editor@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== @@ -3003,14 +3836,25 @@ extglob@^2.0.4: to-regex "^3.0.1" extract-zip@^1.0.3: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" + +extract-zip@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" extsprintf@1.3.0: version "1.3.0" @@ -3022,16 +3866,21 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + fast-glob@^2.0.2: version "2.2.6" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.6.tgz#a5d5b697ec8deda468d85a74035290a025a95295" @@ -3045,11 +3894,11 @@ fast-glob@^2.0.2: micromatch "^3.1.10" fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -3067,13 +3916,18 @@ fbjs@^0.8.16, fbjs@^0.8.9: setimmediate "^1.0.5" ua-parser-js "^0.7.18" -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + figures@^1.3.5, figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -3089,19 +3943,40 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + flat-cache "^2.0.1" + +file-loader@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.0.tgz#65b9fcfb0ea7f65a234a1f10cdd7f1ab9a33f253" + integrity sha512-26qPdHyTsArQ6gU4P1HJbAbnFTyT2r0pG7czh1GFAd9TZbj0n94wWbupgixZH/ET/meqi2/5+F7DhW4OAXD+Lg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.7.1" filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= + +filenamify@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.1.0.tgz#54d110810ae74eebfe115c1b995bd07e03cf2184" + integrity sha512-KQV/uJDI9VQgN7sHH1Zbk6+42cD6mnQ2HONzkXUfPJ+K2FC8GZ1dpewbbHw0Sz8Tf5k3EVdHVayM4DoAwWlmtg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + fill-range@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" @@ -3123,6 +3998,13 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + find-cache-dir@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" @@ -3141,6 +4023,15 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -3156,6 +4047,21 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-yarn-workspace-root@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" + integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== + dependencies: + fs-extra "^4.0.3" + micromatch "^3.1.4" + first-chunk-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70" @@ -3163,15 +4069,27 @@ first-chunk-stream@^2.0.0: dependencies: readable-stream "^2.0.2" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flatted@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flora-colossus@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/flora-colossus/-/flora-colossus-1.0.1.tgz#aba198425a8185341e64f9d2a6a96fd9a3cbdb93" + integrity sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA== + dependencies: + debug "^4.1.1" + fs-extra "^7.0.0" flow-parser@^0.*: version "0.96.1" @@ -3232,15 +4150,19 @@ from2@^2.1.0, from2@^2.1.1: inherits "^2.0.1" readable-stream "^2.0.0" -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" -fs-extra@0.26.7: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" - integrity sha1-muH92UiXeY7at20JGM9C0MMYT6k= +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3248,24 +4170,43 @@ fs-extra@0.26.7: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@5.0.0, fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== +fs-extra@^4.0.0, fs-extra@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^4.0.0, fs-extra@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3296,10 +4237,15 @@ fsevents@^1.2.7: nan "^2.9.2" node-pre-gyp "^0.10.0" -fullstore@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fullstore/-/fullstore-1.1.0.tgz#a7a8b00ca07d86faca05fb825c45e5d1c3bba97e" - integrity sha512-XNlCWr3KBIL97G8mTR+dZ/J648ECCffflfFRgZW3Zm7pO0PYnH/ZCbwZjV1Dw4LrrDdhV6gnayiIcmdIY4JTsw== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fullstore@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fullstore/-/fullstore-3.0.0.tgz#680d5fe282c5f51f67900dbad3fd53e62c954770" + integrity sha512-EEIdG+HWpyygWRwSLIZy+x4u0xtghjHNfhQb0mI5825Mmjq6oFESFUY0hoZigEgd3KH8GX+ZOCK9wgmOiS7VBQ== function-bind@^1.1.1: version "1.1.1" @@ -3311,6 +4257,15 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +galactus@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/galactus/-/galactus-0.2.1.tgz#cbed2d20a40c1f5679a35908e2b9415733e78db9" + integrity sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk= + dependencies: + debug "^3.1.0" + flora-colossus "^1.0.0" + fs-extra "^4.0.0" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3350,11 +4305,30 @@ get-stdin@^4.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" + integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3375,11 +4349,6 @@ gh-got@^6.0.0: got "^7.0.0" is-plain-obj "^1.1.0" -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= - github-username@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" @@ -3418,6 +4387,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@^5.0.0, glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -3435,7 +4411,7 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.1, glob@^6.0.4: +glob@^6.0.1: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= @@ -3446,7 +4422,7 @@ glob@^6.0.1, glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -3458,6 +4434,31 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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" + +global-agent@^2.0.2: + version "2.1.12" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" + integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== + dependencies: + boolean "^3.0.1" + core-js "^3.6.5" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -3478,7 +4479,17 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -global@^4.3.2, global@~4.3.0: +global-tunnel-ng@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" + integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== + dependencies: + encodeurl "^1.0.2" + lodash "^4.17.10" + npm-conf "^1.1.3" + tunnel "^0.0.6" + +global@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= @@ -3486,16 +4497,25 @@ global@^4.3.2, global@~4.3.0: min-document "^2.19.0" process "~0.5.1" -globals@^11.0.1: - version "11.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" - integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== +globalthis@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" + integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + dependencies: + define-properties "^1.1.3" + globby@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-4.1.0.tgz#080f54549ec1b82a6c60e631fc82e1211dbe95f8" @@ -3575,11 +4595,33 @@ got@^8.2.0: url-parse-lax "^3.0.0" url-to-options "^1.0.1" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + grouped-queue@^0.3.0, grouped-queue@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/grouped-queue/-/grouped-queue-0.3.3.tgz#c167d2a5319c5a0e0964ef6a25b7c2df8996c85c" @@ -3597,12 +4639,12 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -3639,6 +4681,11 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + has-symbol-support-x@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" @@ -3729,10 +4776,12 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.2.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== +hoist-non-react-statics@^3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" home-or-tmp@^2.0.0: version "2.0.0" @@ -3742,6 +4791,11 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" +home-path@^1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/home-path/-/home-path-1.0.7.tgz#cf77d7339ff3ddc3347a23c52612b1f5e7e56313" + integrity sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ== + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -3750,15 +4804,20 @@ homedir-polyfill@^1.0.1: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + http-proxy-agent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -3790,13 +4849,27 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" -iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -3814,11 +4887,16 @@ ignore-walk@3.0.3, ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3, ignore@^3.3.5: +ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -3829,6 +4907,14 @@ immutable@3.8.2: resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= +import-fresh@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" + integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3846,11 +4932,21 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3859,20 +4955,25 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= +inherits@2.0.3, inherits@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + ini@^1.3.4, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== inquirer@^1.0.2: version "1.2.3" @@ -3894,26 +4995,6 @@ inquirer@^1.0.2: strip-ansi "^3.0.0" through "^2.3.6" -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== - dependencies: - 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" - inquirer@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" @@ -3965,7 +5046,7 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.0.0, invariant@^2.1.0, invariant@^2.2.1, invariant@^2.2.2: +invariant@^2.1.0, invariant@^2.2.1, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -4003,6 +5084,13 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -4013,6 +5101,13 @@ is-callable@^1.1.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -4085,11 +5180,9 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== is-fullwidth-code-point@^1.0.0: version "1.0.0" @@ -4117,13 +5210,18 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== dependencies: is-extglob "^2.1.1" +is-lite@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/is-lite/-/is-lite-0.6.0.tgz#806b7c967f1d75b5f4121d6ce93107c427b542eb" + integrity sha512-kJ16DuwOhtZg7RimZOf+zK86XOlPeNGGy20MhAfjN/zozuetECxOEtUDUAtzC5n21Yd2lVx6LqZvO1Zvd5DYhw== + is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" @@ -4143,6 +5241,11 @@ is-number@^4.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" @@ -4178,14 +5281,9 @@ is-primitive@^2.0.0: integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-promise@~1, is-promise@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" - integrity sha1-MVc3YcBX4zwukaq56W2gjO++duU= + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== is-regex@^1.0.4: version "1.0.4" @@ -4194,11 +5292,6 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -4238,6 +5331,11 @@ is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -4307,7 +5405,7 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -4317,7 +5415,7 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.13.1, js-yaml@^3.9.1: +js-yaml@3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -4325,6 +5423,21 @@ js-yaml@3.13.1, js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.13.1: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js2xmlparser@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.1.tgz#670ef71bc5661f089cc90481b99a05a1227ae3bd" + integrity sha512-KrPTolcw6RocpYjdC7pL7v62e55q7qOMHvLX1UCLc5AAS8qeJ6nukarEJAF2KL2PZxlbGueEbINqZR2bDe/gUw== + dependencies: + xmlcreate "^2.0.3" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -4351,6 +5464,31 @@ jscodeshift@^0.4.0, jscodeshift@^0.4.1: temp "^0.8.1" write-file-atomic "^1.2.0" +jsdoc@^3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-3.6.6.tgz#9fe162bbdb13ee7988bf74352b5147565bcfd8e1" + integrity sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ== + dependencies: + "@babel/parser" "^7.9.4" + bluebird "^3.7.2" + catharsis "^0.8.11" + escape-string-regexp "^2.0.0" + js2xmlparser "^4.0.1" + klaw "^3.0.0" + markdown-it "^10.0.0" + markdown-it-anchor "^5.2.7" + marked "^0.8.2" + mkdirp "^1.0.4" + requizzle "^0.2.3" + strip-json-comments "^3.1.0" + taffydb "2.6.2" + underscore "~1.10.2" + +jsdoctypeparser@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26" + integrity sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw== + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -4371,10 +5509,10 @@ json-loader@0.5.7: resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.4.1: version "0.4.1" @@ -4391,7 +5529,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -4408,6 +5546,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -4422,6 +5567,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4450,6 +5604,21 @@ jszip@3.1.5: pako "~1.0.2" readable-stream "~2.0.6" +jszip@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.5.0.tgz#b4fd1f368245346658e781fec9675802489e15f6" + integrity sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + keycode@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" @@ -4467,6 +5636,13 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -4491,6 +5667,13 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -4498,6 +5681,13 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +klaw@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146" + integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== + dependencies: + graceful-fs "^4.1.9" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -4505,13 +5695,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" + prelude-ls "^1.2.1" + type-check "~0.4.0" lie@~3.1.0: version "3.1.1" @@ -4520,6 +5710,20 @@ lie@~3.1.0: dependencies: immediate "~3.0.5" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" + listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" @@ -4601,7 +5805,7 @@ loader-fs-cache@^1.0.0: find-cache-dir "^0.1.1" mkdirp "0.5.1" -loader-runner@^2.3.0: +loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== @@ -4615,6 +5819,24 @@ loader-utils@^1.0.2, loader-utils@^1.1.0: emojis-list "^2.0.0" json5 "^1.0.1" +loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -4623,10 +5845,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -lodash-es@^4.2.0, lodash-es@^4.2.1: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78" - integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ== +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" lodash.cond@^4.3.0: version "4.5.2" @@ -4638,15 +5863,15 @@ lodash.get@^4.0.0, lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= -lodash.isequal@^4.1.1: +lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= -lodash@>=4.17.13, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: - version "4.17.13" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" - integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== +lodash@>=4.17.21, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@2.2.0, log-symbols@^2.2.0: version "2.2.0" @@ -4695,11 +5920,16 @@ lowercase-keys@1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^4.0.1, lru-cache@^4.1.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -4708,6 +5938,13 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -4715,6 +5952,19 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4732,6 +5982,34 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-it-anchor@^5.2.7: + version "5.3.0" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz#d549acd64856a8ecd1bea58365ef385effbac744" + integrity sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA== + +markdown-it@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-10.0.0.tgz#abfc64f141b1722d663402044e43927f1f50a8dc" + integrity sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg== + dependencies: + argparse "^1.0.7" + entities "~2.0.0" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +marked@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" + integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== + +matcher@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" + integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== + dependencies: + escape-string-regexp "^4.0.0" + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -4746,6 +6024,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= + mem-fs-editor@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz#dd0a6eaf2bb8a6b37740067aa549eb530105af9f" @@ -4778,7 +6061,7 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" -memory-fs@^0.4.0, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -4786,6 +6069,14 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + meow@^3.1.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -4831,7 +6122,7 @@ micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4850,6 +6141,14 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -4858,17 +6157,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.22" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" - integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "~1.38.0" + mime-db "1.44.0" mime@^1.4.1: version "1.6.0" @@ -4880,7 +6179,7 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== -mimic-response@^1.0.0: +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -4902,7 +6201,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -4914,7 +6213,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.3, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#3db5c0765545ab8637be71f333a104a965a9ca3f" integrity sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw== @@ -4924,6 +6223,11 @@ minimist@^0.1.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" integrity sha1-md9lelJXTCHJBXSX33QnkLK0wN4= +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minipass@^2.2.1, minipass@^2.3.4: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" @@ -4955,6 +6259,22 @@ mississippi@^2.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -4963,26 +6283,24 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, mkdirp@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -mkpath@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91" - integrity sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE= - -mksnapshot@^0.3.4: - version "0.3.5" - resolved "https://registry.yarnpkg.com/mksnapshot/-/mksnapshot-0.3.5.tgz#c63a9f91138ca9392e42b9979c31179ac900d4c0" - integrity sha512-PSBoZaj9h9myC3uRRW62RxmX8mrN3XbOkMEyURUD7v5CeJgtYTar50XU738t7Q0LtG1pBPtp5n5QwDGggRnEvw== +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - decompress-zip "0.3.x" - fs-extra "0.26.7" - request "2.x" + minimist "^1.2.5" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mocha@5.0.0: version "5.0.0" @@ -5047,25 +6365,11 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mz@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - nan@^2.9.2: version "2.13.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== -nan@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" - integrity sha1-7XFfP+neArV6XmJS2QqWZ14fCFo= - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -5102,23 +6406,26 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== -nested-property@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-0.0.7.tgz#ff222f233ca8793c6828b4117091bea597130f4f" - integrity sha1-/yIvIzyoeTxoKLQRcJG+pZcTD08= +neo-async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nested-property@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-1.0.1.tgz#2001105b5c69413411b876bba9b86f4316af613f" + integrity sha512-BnBBoo/8bBNRdAnJc7+m79oWk7dXwW1+vCesaEQhfDGVwXGLMvmI4NwYgLTW94R/x+R2s/yr2g/hB/4w/YSAvA== + +nested-property@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nested-property/-/nested-property-1.0.4.tgz#4068c4289d1f3ac9f367e784502ff342d277ee2f" + integrity sha512-6fNIumJJUyP3rkB4FyVYCYpdW+PKUCaxRWRGLLf0kv/RKoG4mbTvInedA9x3zOyuOmOkGudKuAtPSI+dnhwj2g== nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-abi@^2.1.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.7.1.tgz#a8997ae91176a5fbaa455b194976e32683cda643" - integrity sha512-OV8Bq1OrPh6z+Y4dqwo05HqrRL9YNF7QVMRfq1/pguwKLG+q9UB/Lk0x5qXjO23JjJg+/jqCHSTaG1P3tfKfuw== - dependencies: - semver "^5.4.1" - node-dir@0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d" @@ -5142,10 +6449,10 @@ node-gyp-build@~3.7.0: resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== -node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== dependencies: assert "^1.1.1" browserify-zlib "^0.2.0" @@ -5157,7 +6464,7 @@ node-libs-browser@^2.0.0: events "^3.0.0" https-browserify "^1.0.0" os-browserify "^0.3.0" - path-browserify "0.0.0" + path-browserify "0.0.1" process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" @@ -5169,7 +6476,7 @@ node-libs-browser@^2.0.0: tty-browserify "0.0.0" url "^0.11.0" util "^0.11.0" - vm-browserify "0.0.4" + vm-browserify "^1.0.1" node-pre-gyp@^0.10.0: version "0.10.3" @@ -5187,14 +6494,6 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -nodeify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" - integrity sha1-ZKtpp7268DzhB7TwM1yHwLnpGx0= - dependencies: - is-promise "~1.0.0" - promise "~1.3.0" - nomnom@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" @@ -5203,18 +6502,6 @@ nomnom@^1.8.1: chalk "~0.4.0" underscore "~1.6.0" -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= - -nopt@^3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -5223,13 +6510,6 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -5247,7 +6527,7 @@ normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -5261,11 +6541,24 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +normalize-url@^4.1.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" + integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== +npm-conf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" + integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== + dependencies: + config-chain "^1.1.11" + pify "^3.0.0" + npm-packlist@^1.1.6: version "1.4.1" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" @@ -5281,7 +6574,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.1, npmlog@^4.0.2: +npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -5291,7 +6584,7 @@ npmlog@^4.0.1, npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" -nugget@^2.0.1: +nugget@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" integrity sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA= @@ -5394,17 +6687,17 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" ora@^0.2.3: version "0.2.3" @@ -5421,7 +6714,7 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= @@ -5463,6 +6756,11 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -5492,6 +6790,13 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5499,6 +6804,13 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -5528,6 +6840,11 @@ p-try@^1.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + pako@~1.0.2, pako@~1.0.5: version "1.0.10" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" @@ -5542,6 +6859,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.4" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" @@ -5602,17 +6926,35 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +patch-package@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.2.tgz#71d170d650c65c26556f0d0fbbb48d92b6cc5f39" + integrity sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^2.4.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^1.2.1" + fs-extra "^7.0.1" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.0" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= -path-exists@^2.0.0: +path-exists@^2.0.0, path-exists@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= @@ -5629,16 +6971,16 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -5693,6 +7035,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -5703,6 +7050,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -5729,16 +7081,14 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -plist@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025" - integrity sha1-V8zbeggh3yGDEhejytVOPhRqECU= +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: - base64-js "1.2.0" - xmlbuilder "8.2.2" - xmldom "0.1.x" + find-up "^3.0.0" -plist@^3.0.1: +plist@^3.0.0, plist@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== @@ -5747,40 +7097,81 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== +popper.js@^1.16.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -prebuild-install@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.3.0.tgz#19481247df728b854ab57b187ce234211311b485" - integrity sha512-gzjq2oHB8oMbzJSsSh9MQ64zrXZGt092/uT4TLZlz2qnrPxpWqp4vYB7LZrDxnlxf5RfbCjkgDI/z0EIVuYzAw== +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== dependencies: - expand-template "^1.0.2" - github-from-package "0.0.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - node-abi "^2.1.1" - noop-logger "^0.1.1" - npmlog "^4.0.1" - os-homedir "^1.0.1" - pump "^1.0.1" - rc "^1.1.6" - simple-get "^1.4.2" - tar-fs "^1.13.0" - tunnel-agent "^0.6.0" - xtend "4.0.1" + postcss "^7.0.5" -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c" + integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + dependencies: + cssesc "^3.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== + +postcss@^7.0.14, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.36" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" + integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prepend-http@^1.0.1: version "1.0.4" @@ -5797,11 +7188,23 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + prettier@^1.5.3: version "1.16.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717" integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g== +prettier@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz#d6d56282455243f2f92cc1716692c08aa31522d4" + integrity sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg== + pretty-bytes@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" @@ -5820,7 +7223,7 @@ private@^0.1.6, private@^0.1.7, private@^0.1.8, private@~0.1.5: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: +process-nextick-args@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== @@ -5830,6 +7233,11 @@ process-nextick-args@~1.0.6: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -5848,7 +7256,7 @@ progress-stream@^1.1.0: speedometer "~0.1.2" through2 "~0.2.3" -progress@^2.0.0: +progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -5865,13 +7273,6 @@ promise@^7.1.1: dependencies: asap "~2.0.3" -promise@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" - integrity sha1-5cyaTIJ45GZP/twBx9qEhCsEAXU= - dependencies: - is-promise "~1" - prop-types-extra@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.0.tgz#32609910ea2dcf190366bacd3490d5a6412a605f" @@ -5889,7 +7290,7 @@ prop-types@15.6.0: loose-envify "^1.3.1" object-assign "^4.1.1" -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: +prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -5898,10 +7299,15 @@ prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2: object-assign "^4.1.1" react-is "^16.8.1" -protobufjs@>=6.8.6: - version "6.8.8" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c" - integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw== +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= + +protobufjs@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.10.2.tgz#b9cb6bd8ec8f87514592ba3fdfd28e93f33a469b" + integrity sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ== dependencies: "@protobufjs/aspromise" "^1.1.2" "@protobufjs/base64" "^1.1.2" @@ -5913,8 +7319,8 @@ protobufjs@>=6.8.6: "@protobufjs/path" "^1.1.2" "@protobufjs/pool" "^1.1.0" "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.0" - "@types/node" "^10.1.0" + "@types/long" "^4.0.1" + "@types/node" "^13.7.0" long "^4.0.0" prr@~1.0.1: @@ -5922,22 +7328,15 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -pruner@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/pruner/-/pruner-0.0.7.tgz#345fbcb3e80701163a1d7adf56bac229a5a1e4c1" - integrity sha1-NF+8s+gHARY6HXrfVrrCKaWh5ME= - dependencies: - fs-extra "^4.0.0" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -5951,14 +7350,6 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^1.0.0, pump@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" - integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -5967,6 +7358,14 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -5981,21 +7380,16 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.2.4: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - qs@^6.5.1: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -6025,13 +7419,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -rafl@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rafl/-/rafl-1.2.2.tgz#fe930f758211020d47e38815f5196a8be4150740" - integrity sha1-/pMPdYIRAg1H44gV9Rlqi+QVB0A= - dependencies: - global "~4.3.0" - randomatic@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" @@ -6041,7 +7428,7 @@ randomatic@^3.0.0: kind-of "^6.0.0" math-random "^1.0.1" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -6056,7 +7443,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.1.6, rc@^1.2.1, rc@^1.2.7: +rc@^1.1.2, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -6066,20 +7453,21 @@ rc@^1.1.6, rc@^1.2.1, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -rcedit@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-0.9.0.tgz#3910df57345399e2b0325f4a519007f89e55ef1c" - integrity sha1-ORDfVzRTmeKwMl9KUZAH+J5V7xw= +rcedit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.2.0.tgz#3bfe71248749fa821fef26eda3d35f4e0ee47afc" + integrity sha512-dhFtYmQS+V8qQIANyX6zDK+sO50ayDePKApi46ZPK8I6QeyyTDD6LManMa7a3p3c9mLM4zi9QBP41pfhQ9p7Sg== -react-ace@5.9.0: - version "5.9.0" - resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-5.9.0.tgz#427a1cc4869b960a6f9748aa7eb169a9269fc336" - integrity sha512-r6Tuce6seG05g9kT2Tio6DWohy06knG7e5u9OfhvMquZL+Cyu4eqPf60K1Vi2RXlS3+FWrdG8Rinwu4+oQjjgw== +react-ace@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-9.1.3.tgz#848dc3741d5460f3ac73468b6c39879aab9238bc" + integrity sha512-1TZBs/9hFGgPuzu6DUiBogyhRA5Z1Po2wzPfZslbrTFGQtbNe+JXHuPoJNlUu/uerElzOLLsuJEDTO9FfLnZJA== dependencies: - brace "^0.11.0" + ace-builds "^1.4.6" + diff-match-patch "^1.0.4" lodash.get "^4.4.2" - lodash.isequal "^4.1.1" - prop-types "^15.5.8" + lodash.isequal "^4.5.0" + prop-types "^15.7.2" react-bootstrap@0.32.0: version "0.32.0" @@ -6099,34 +7487,58 @@ react-bootstrap@0.32.0: uncontrollable "^4.1.0" warning "^3.0.0" -react-dom@>=16.2.1: - version "16.8.6" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f" - integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA== +react-dom@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" + integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" prop-types "^15.6.2" - scheduler "^0.13.6" + scheduler "^0.19.1" + +react-floater@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/react-floater/-/react-floater-0.7.2.tgz#c0c7ddab18a955b1c4a3934890fa804b3d2a4801" + integrity sha512-YKixUNXdySMqo4gh6ZGVLI/h7cI59MFQKOG38jAdBJl7XVC///w+sa7dmz+o2xWe4oUSey3z2vmg+AtX7A7Kug== + dependencies: + deepmerge "^4.2.2" + exenv "^1.2.2" + is-lite "^0.6.0" + popper.js "^1.16.0" + react-proptype-conditional-require "^1.0.4" + tree-changes "^0.5.1" react-immutable-proptypes@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/react-immutable-proptypes/-/react-immutable-proptypes-2.1.0.tgz#023d6f39bb15c97c071e9e60d00d136eac5fa0b4" integrity sha1-Aj1vObsVyXwHHp5g0A0TbqxfoLQ= -react-is@^16.3.2, react-is@^16.8.1: +react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.9.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^16.3.2: version "16.8.6" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== -react-joyride@1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/react-joyride/-/react-joyride-1.11.1.tgz#d1849f5fc531894f2adf05b2003fa627273c1d34" - integrity sha512-EHtFOY6ICAROJ3OHGVzYkEjCk0xmAUrOHJNYIXf6pG5mdXbeM44pLvEjz2otoTc1bM1zOYuNdC6KeVgCm902qw== - dependencies: - eslint-plugin-import "^2.8.0" - nested-property "^0.0.7" - scroll "^2.0.1" +react-joyride@*, react-joyride@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/react-joyride/-/react-joyride-2.2.1.tgz#a65fe7aba1184f2ceff3b2b79beffcc3cad17231" + integrity sha512-2dcfuOPW1viQ7TxUxLajNJJiW+I4dh3dPaySuvc1uiWK1qC8uaxjhGwWSIdQitVw0j1/4NU7P2dPuB9d5umtlw== + dependencies: + deep-diff "^1.0.2" + deepmerge "^4.2.2" + exenv "^1.2.2" + is-lite "^0.6.0" + nested-property "^1.0.2" + react-floater "^0.7.2" + react-is "^16.12.0" + scroll "^3.0.1" + scrollparent "^2.0.1" + tree-changes "^0.5.1" react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -6152,17 +7564,21 @@ react-prop-types@^0.4.0: dependencies: warning "^3.0.0" -react-redux@5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.6.tgz#23ed3a4f986359d68b5212eaaa681e60d6574946" - integrity sha512-8taaaGu+J7PMJQDJrk/xiWEYQmdo3mkXw6wPr3K3LxvXis3Fymiq7c13S+Tpls/AyNUAsoONkU81AP0RA6y6Vw== +react-proptype-conditional-require@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-proptype-conditional-require/-/react-proptype-conditional-require-1.0.4.tgz#69c2d5741e6df5e08f230f36bbc2944ee1222555" + integrity sha1-acLVdB5t9eCPIw82u8KUTuEiJVU= + +react-redux@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.1.tgz#8dedf784901014db2feca1ab633864dee68ad985" + integrity sha512-T+VfD/bvgGTUA74iW9d2i5THrDQWbweXP0AVNI8tNd1Rk5ch1rnMiJkDD67ejw7YBKM4+REvcvqRuWJb7BLuEg== dependencies: - hoist-non-react-statics "^2.2.1" - invariant "^2.0.0" - lodash "^4.2.0" - lodash-es "^4.2.0" - loose-envify "^1.1.0" - prop-types "^15.5.10" + "@babel/runtime" "^7.5.5" + hoist-non-react-statics "^3.3.0" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^16.9.0" react-transition-group@^2.0.0, react-transition-group@^2.2.0: version "2.8.0" @@ -6174,15 +7590,14 @@ react-transition-group@^2.0.0, react-transition-group@^2.2.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba" - integrity sha512-ZmIomM7EE1DvPEnSFAHZn9Vs9zJl5A9H7el0EGTE6ZbW9FKe/14IYAlPbC8iH25YarEQxZL+E8VW7Mi7kfQrDQ== +react@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" + integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== dependencies: - fbjs "^0.8.16" loose-envify "^1.1.0" object-assign "^4.1.1" - prop-types "^15.6.0" + prop-types "^15.6.2" read-chunk@^2.0.0: version "2.1.0" @@ -6226,7 +7641,7 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -6239,7 +7654,20 @@ read-pkg@^2.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^1.1.8, readable-stream@~1.1.9: +readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= @@ -6270,6 +7698,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + recast@^0.12.5: version "0.12.9" resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1" @@ -6306,20 +7741,20 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -redux-saga@0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724" - integrity sha1-CiMdsKFIkwHdmA9vL4jYztQY9yQ= +redux-saga@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112" + integrity sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw== + dependencies: + "@redux-saga/core" "^1.1.3" -redux@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b" - integrity sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A== +redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" + integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== dependencies: - lodash "^4.2.1" - lodash-es "^4.2.1" - loose-envify "^1.1.0" - symbol-observable "^1.0.3" + loose-envify "^1.4.0" + symbol-observable "^1.2.0" regenerate@^1.2.1: version "1.4.0" @@ -6336,6 +7771,11 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -6360,6 +7800,11 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -6369,6 +7814,11 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regextras@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2" + integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w== + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" @@ -6413,10 +7863,10 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= -request@2.x, request@^2.45.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== +request@^2.45.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -6425,7 +7875,7 @@ request@2.x, request@^2.45.0: extend "~3.0.2" forever-agent "~0.6.1" form-data "~2.3.2" - har-validator "~5.1.0" + har-validator "~5.1.3" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -6435,7 +7885,7 @@ request@2.x, request@^2.45.0: performance-now "^2.1.0" qs "~6.5.2" safe-buffer "^5.1.2" - tough-cookie "~2.4.3" + tough-cookie "~2.5.0" tunnel-agent "^0.6.0" uuid "^3.3.2" @@ -6449,13 +7899,12 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= +requizzle@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.3.tgz#4675c90aacafb2c036bd39ba2daa4a1cb777fded" + integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" + lodash "^4.17.14" resolve-cwd@^2.0.0: version "2.0.0" @@ -6472,29 +7921,36 @@ resolve-dir@^1.0.0: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.5.0, resolve@^1.9.0: +resolve@^1.1.6, resolve@^1.5.0: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: path-parse "^1.0.6" -responselike@1.0.2: +resolve@^1.10.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= @@ -6522,13 +7978,27 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@2.6.3, rimraf@^2.2.0, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: glob "^7.1.3" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" @@ -6542,13 +8012,30 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-async@^2.0.0, run-async@^2.2.0: +roarr@^2.15.3: + version "2.15.3" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.3.tgz#65248a291a15af3ebfd767cbf7e44cb402d1d836" + integrity sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA== + dependencies: + boolean "^3.0.0" + detect-node "^2.0.4" + globalthis "^1.0.1" + json-stringify-safe "^5.0.1" + semver-compare "^1.0.0" + sprintf-js "^1.1.2" + +run-async@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -6561,18 +8048,6 @@ rwlock@^5.0.0: resolved "https://registry.yarnpkg.com/rwlock/-/rwlock-5.0.0.tgz#888d6a77a3351cc1a209204ef2ee1722093836cf" integrity sha1-iI1qd6M1HMGiCSBO8u4XIgk4Ns8= -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= - rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" @@ -6592,7 +8067,12 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -6604,15 +8084,15 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sanitize-filename@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" - integrity sha1-YS2hyWRz+gLczaktzVtKsWSmdyo= +sanitize-filename@^1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" + integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== dependencies: truncate-utf8-bytes "^1.0.0" @@ -6621,15 +8101,15 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.13.6: - version "0.13.6" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" - integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^0.4.2, schema-utils@^0.4.5: +schema-utils@^0.4.5: version "0.4.7" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== @@ -6637,38 +8117,98 @@ schema-utils@^0.4.2, schema-utils@^0.4.5: ajv "^6.1.0" ajv-keywords "^3.1.0" +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.6, schema-utils@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + scoped-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/scoped-regex/-/scoped-regex-1.0.0.tgz#a346bb1acd4207ae70bd7c0c7ca9e566b6baddb8" integrity sha1-o0a7Gs1CB65wvXwMfKnlZra63bg= -scroll@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/scroll/-/scroll-2.0.3.tgz#0951b785544205fd17753bc3d294738ba16fc2ab" - integrity sha512-3ncZzf8gUW739h3LeS68nSssO60O+GGjT3SxzgofQmT8PIoyHzebql9HHPJopZX8iT6TKOdwaWFMqL6LzUN3DQ== - dependencies: - rafl "~1.2.1" +scroll@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scroll/-/scroll-3.0.1.tgz#d5afb59fb3592ee3df31c89743e78b39e4cd8a26" + integrity sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg== + +scrollparent@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/scrollparent/-/scrollparent-2.0.1.tgz#715d5b9cc57760fb22bdccc3befb5bfe06b1a317" + integrity sha1-cV1bnMV3YPsivczDvvtb/gaxoxc= seedrandom@2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" integrity sha1-JDhQTa0zkXMUv/GKxNeU8W1qrsw= -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^5.5.0, semver@^5.6.0: version "5.7.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +serialize-error@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" + integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== + dependencies: + type-fest "^0.13.1" + serialize-javascript@^1.4.0: version "1.6.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -6709,11 +8249,23 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + shelljs@^0.7.0: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" @@ -6724,18 +8276,9 @@ shelljs@^0.7.0: rechoir "^0.6.2" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -simple-get@^1.4.2: - version "1.4.3" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb" - integrity sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s= - dependencies: - once "^1.3.1" - unzip-response "^1.0.0" - xtend "^4.0.0" + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== single-line-log@^1.1.2: version "1.1.2" @@ -6749,16 +8292,23 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" slide@^1.1.5: @@ -6766,14 +8316,14 @@ slide@^1.1.5: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smalltalk@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/smalltalk/-/smalltalk-2.5.1.tgz#488176544010f8a1defd38adb1367a25ac489de2" - integrity sha512-LZYd80hd9DkXBUnm5AyMdMNx9XCxYZZskmrp3W6M77jhOEvzQ9SpDqtvDE7e8y1lfMeIAG9nIFU6Y5quZoXV5g== +smalltalk@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/smalltalk/-/smalltalk-4.0.6.tgz#c5652e42ebd7bb7216192c4991a55edd2ef540d5" + integrity sha512-P/0tvDkGjrYLXR0y0XV0Gzr1c9ZZ3BIOK+YoNL3oapYq/S9WkXuItJhN4wes34ItTGJOH0nX4AeQVJ2LLrXLjg== dependencies: - currify "^2.0.3" - es6-promise "^4.1.1" - fullstore "^1.0.0" + "@cloudcmd/create-element" "^2.0.0" + currify "^4.0.0" + fullstore "^3.0.0" snapdragon-node@^2.0.1: version "2.1.1" @@ -6805,17 +8355,17 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socket.io-client@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" - integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== +socket.io-client@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4" + integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA== dependencies: backo2 "1.0.2" base64-arraybuffer "0.1.5" component-bind "1.0.0" component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.3.1" + debug "~4.1.0" + engine.io-client "~3.4.0" has-binary2 "~1.0.2" has-cors "1.1.0" indexof "0.0.1" @@ -6864,6 +8414,14 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.17, source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -6874,7 +8432,7 @@ source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6888,30 +8446,30 @@ spawn-sync@^1.0.15: os-shim "^0.1.2" spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== +spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" - integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== + version "3.0.5" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" + integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== speedometer@~0.1.2: version "0.1.4" @@ -6925,26 +8483,31 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -ssh2-streams@~0.1.18: - version "0.1.20" - resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.1.20.tgz#51118d154555df5469ee1f67e0cf1e7e8a2c0e3a" - integrity sha1-URGNFUVV31Rp7h9n4M8efoosDjo= +ssh2-streams@~0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/ssh2-streams/-/ssh2-streams-0.4.10.tgz#48ef7e8a0e39d8f2921c30521d56dacb31d23a34" + integrity sha512-8pnlMjvnIZJvmTzUIIA5nT4jr2ZWNNVHwyXfMGdRJbug9TpI3kd99ffglgfSWqujVv/0gxwMsDn9j9RVst8yhQ== dependencies: asn1 "~0.2.0" - semver "^5.1.0" + bcrypt-pbkdf "^1.0.2" streamsearch "~0.1.2" -ssh2@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.5.5.tgz#c7781ecd2ece7304a253cf620fab5a5c22bb2235" - integrity sha1-x3gezS7OcwSiU89iD6taXCK7IjU= +ssh2@^0.8.9: + version "0.8.9" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-0.8.9.tgz#54da3a6c4ba3daf0d8477a538a481326091815f3" + integrity sha512-GmoNPxWDMkVpMFa9LVVzQZHF6EW3WKmBwL+4/GeILf2hFmix5Isxm7Amamo8o7bHiU0tC+wXsGcUXOxp8ChPaw== dependencies: - ssh2-streams "~0.1.18" + ssh2-streams "~0.4.10" sshpk@^1.7.0: version "1.16.1" @@ -6968,6 +8531,13 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -7046,7 +8616,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -7054,6 +8624,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string_decoder@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -7087,13 +8666,20 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0: +strip-ansi@^5.0.0, strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" @@ -7131,22 +8717,50 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" +strip-json-comments@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + stubs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= -sumchecker@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" - integrity sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4= +style-loader@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +sumchecker@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d" + integrity sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0= dependencies: debug "^2.2.0" + es6-promise "^4.0.5" + +sumchecker@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" + integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== + dependencies: + debug "^4.1.0" superagent@3.8.2: version "3.8.2" @@ -7183,6 +8797,20 @@ supports-color@^5.2.0, supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== + dependencies: + has-flag "^4.0.0" + symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" @@ -7193,50 +8821,35 @@ symbol-observable@^0.2.2: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" integrity sha1-lag9smGG1q9+ehjb2XYKL4bQj0A= -symbol-observable@^1.0.3: +symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +taffydb@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268" + integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg= tapable@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== -tar-fs@^1.13.0: - version "1.16.3" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" - integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw== - dependencies: - chownr "^1.0.1" - mkdirp "^0.5.1" - pump "^1.0.0" - tar-stream "^1.1.2" - -tar-stream@^1.1.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" - integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== - dependencies: - 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" +tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== tar@^4: version "4.4.8" @@ -7270,7 +8883,31 @@ temp@^0.8.1: os-tmpdir "^1.0.0" rimraf "~2.2.6" -text-table@^0.2.0, text-table@~0.2.0: +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -7280,20 +8917,6 @@ textextensions@^2.4.0: resolved "https://registry.yarnpkg.com/textextensions/-/textextensions-2.4.0.tgz#6a143a985464384cc2cff11aea448cd5b018e72b" integrity sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA== -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= - dependencies: - any-promise "^1.0.0" - throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" @@ -7332,13 +8955,6 @@ timers-browserify@^2.0.4: dependencies: setimmediate "^1.0.4" -tmp@0.0.28: - version "0.0.28" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" - integrity sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA= - dependencies: - os-tmpdir "~1.0.1" - tmp@^0.0.29: version "0.0.29" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" @@ -7363,11 +8979,6 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= -to-buffer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" - integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== - to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -7380,6 +8991,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -7388,6 +9004,13 @@ to-regex-range@^2.1.0: is-number "^3.0.0" repeat-string "^1.6.1" +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" @@ -7398,31 +9021,34 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -touch@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d" - integrity sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0= +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: - nopt "~1.0.10" + psl "^1.1.28" + punycode "^2.1.1" -tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== +tree-changes@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/tree-changes/-/tree-changes-0.5.1.tgz#e31cc8a0f56c8c401f0a88243d9165dbea4f570c" + integrity sha512-O873xzV2xRZ6N059Mn06QzmGKEE21LlvIPbsk2G+GS9ZX5OCur6PIwuuh0rWpAPvLWQZPj0XObyG27zZyLHUzw== dependencies: - psl "^1.1.24" - punycode "^1.4.1" - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + deep-diff "^1.0.2" + nested-property "1.0.1" trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -7435,11 +9061,45 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" +ts-loader@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.2.tgz#ee73ca9350f745799396fff8578ba29b1e95616b" + integrity sha512-oYT7wOTUawYXQ8XIDsRhziyW0KUEV38jISYlE+9adP6tDtG+O5GkRe4QKQXrHVH4mJJ88DysvEtvGP65wMLlhg== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^4.0.0" + semver "^6.0.0" + +ts-node@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" + integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +tslib@^1.8.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -7452,32 +9112,76 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tunnel@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - prelude-ls "~1.1.2" + prelude-ls "^1.2.1" type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript-compare@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" + integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== + dependencies: + typescript-logic "^0.0.0" + +typescript-logic@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" + integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== + +typescript-tuple@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" + integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== + dependencies: + typescript-compare "^0.0.2" + +typescript@^3.9.7: + version "3.9.7" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== + ua-parser-js@^0.7.18: - version "0.7.19" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" - integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== + version "0.7.28" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.28.tgz#8ba04e653f35ce210239c64661685bf9121dec31" + integrity sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g== + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-es@^3.3.4: version "3.3.9" @@ -7487,7 +9191,7 @@ uglify-es@^3.3.4: commander "~2.13.0" source-map "~0.6.1" -uglifyjs-webpack-plugin@^1.1.1, uglifyjs-webpack-plugin@^1.2.2: +uglifyjs-webpack-plugin@^1.2.2: version "1.3.0" resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== @@ -7513,6 +9217,11 @@ uncontrollable@^4.1.0: dependencies: invariant "^2.1.0" +underscore@~1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" + integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== + underscore@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" @@ -7528,7 +9237,12 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-filename@^1.1.0: +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unique-filename@^1.1.0, unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -7547,6 +9261,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -7567,10 +9286,14 @@ untildify@^3.0.3: resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== -unzip-response@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" - integrity sha1-uYTwh3/AqJwsdzzB73tbIytbBv4= +unzip-crx-3@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz#d5324147b104a8aed9ae8639c95521f6f7cda292" + integrity sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ== + dependencies: + jszip "^3.1.0" + mkdirp "^0.5.1" + yaku "^0.16.6" upath@^1.1.1: version "1.1.2" @@ -7626,14 +9349,12 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -utf-8-validate@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-4.0.0.tgz#93812f447b6fd11a3dad4302d5870830cae8470a" - integrity sha512-JS/c6nR/qauqSdvTksgDO1142kYddTXz42y5X/he188B/kgcFLLB4l9CfZd+hGic/ORgsL+pPfwr9lYsL/80Fw== +utf-8-validate@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" + integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== dependencies: - bindings "~1.3.0" - nan "~2.8.0" - prebuild-install "~2.3.0" + node-gyp-build "~3.7.0" utf8-byte-length@^1.0.1: version "1.0.4" @@ -7669,6 +9390,11 @@ v8-compile-cache@^1.1.2: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz#8d32e4f16974654657e676e0e467a348e89b0dc4" integrity sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA== +v8-compile-cache@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -7719,12 +9445,10 @@ vinyl@^2.0.1: remove-trailing-separator "^1.0.1" replace-ext "^1.0.0" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== warning@^3.0.0: version "3.0.0" @@ -7733,14 +9457,23 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.4.tgz#6e9da53b3c80bb2d6508188f5b200410866cd30b" + integrity sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg== dependencies: - chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.0" webpack-addons@^1.1.5: version "1.1.5" @@ -7784,7 +9517,7 @@ webpack-cli@2.0.10: yeoman-environment "^2.0.0" yeoman-generator "github:ev1stensberg/generator#Feature-getArgument" -webpack-sources@^1.0.1, webpack-sources@^1.1.0: +webpack-sources@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -7792,35 +9525,47 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.1.0.tgz#91b6862e56eb3b18b79bb10b51866987ff10d2d6" - integrity sha512-ZFYcAZ44kOT+xsS5MS2H1fQr0PJkwQdYem/d17wacDkkupzsAkBJ3hDShWHdPVvWluFs6pfhHWw/dVso1m0rsA== +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^0.1.1" - enhanced-resolve "^4.0.0" - eslint-scope "^3.7.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.2" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.1.1" - watchpack "^1.5.0" - webpack-sources "^1.0.1" + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@^4.44.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.3.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.7.4" + webpack-sources "^1.4.1" whatwg-fetch@>=0.10.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" - integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + version "3.4.1" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.1.tgz#e5f871572d6879663fa5674c8f833f15a8425ab3" + integrity sha512-sofZVzE1wKwO+EYPbWfiwzaKovWiZXf4coEzjGP9b2GBVgQRLQUZ2QcuPpQExGDAW5GItpEm6Tl4OU5mywnAoQ== which-module@^2.0.0: version "2.0.0" @@ -7834,6 +9579,13 @@ which@^1.2.14, which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -7841,10 +9593,10 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== worker-farm@^1.5.2: version "1.6.0" @@ -7853,6 +9605,13 @@ worker-farm@^1.5.2: dependencies: errno "~0.1.7" +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -7875,10 +9634,10 @@ write-file-atomic@^1.2.0: imurmurhash "^0.1.4" slide "^1.1.5" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" @@ -7898,16 +9657,16 @@ ws@~6.1.0: dependencies: async-limiter "~1.0.0" -xmlbuilder@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" - integrity sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M= - xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlcreate@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.3.tgz#df9ecd518fd3890ab3548e1b811d040614993497" + integrity sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ== + xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" @@ -7918,7 +9677,7 @@ xmlhttprequest-ssl@~1.5.4: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= -xtend@4.0.1, xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= @@ -7931,15 +9690,20 @@ xtend@~2.1.1: object-keys "~0.4.0" y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yaku@^0.16.6: + version "0.16.7" + resolved "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e" + integrity sha1-HRlceKqbW/hHnIlblQT9TwhHmE4= + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -7950,6 +9714,11 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== +yargs-parser@^20.0.0: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" @@ -7957,13 +9726,6 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ== - dependencies: - camelcase "^4.1.0" - yargs@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" @@ -7990,12 +9752,13 @@ yargs@~1.2.6: dependencies: minimist "^0.1.0" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: - fd-slicer "~1.0.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yazl@^2.4.3: version "2.5.1" @@ -8078,6 +9841,11 @@ yeoman-environment@^2.0.0: through2 "^2.0.0" yeoman-environment "^1.1.0" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + zip-webpack-plugin@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/zip-webpack-plugin/-/zip-webpack-plugin-3.0.0.tgz#63b3c173f1a87a006915cd7328a3c40b44dc8e32"