diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..2ceff042 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,4 @@ +# These are supported funding model platforms + +github: skarab42 +custom: ["tipeee.com/skarab42/","paypal.me/skarab"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e31fff8..3f7336c5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,9 @@ name: Build/release -on: push +on: + push: + tags: + - "v*" jobs: release: @@ -17,11 +20,12 @@ jobs: - name: Install Node.js, NPM and Yarn uses: actions/setup-node@v1 with: - node-version: 10 + node-version: 12 - name: Build/release Electron app uses: samuelmeuli/action-electron-builder@v1 with: + args: -c.snap.publish=github # GitHub token, automatically provided to the action # (No need to define this secret in the repo settings) github_token: ${{ secrets.github_token }} diff --git a/.gitignore b/.gitignore index f9d427ab..67d327df 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,9 @@ node_modules/ dist/ *_.* *_ + +yarn-error.log + +.idea/ + +.DS_Store diff --git a/.prettierrc b/.prettierrc index a46a3e09..0a333240 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,6 +2,7 @@ "semi": true, "tabWidth": 2, "useTabs": false, + "endOfLine": "crlf", "singleQuote": false, "trailingComma": "es5", "svelteStrictMode": true, diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..ee0aedf7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,365 @@ +## [1.4.1](https://github.com/skarab42/marv/compare/v1.3.0...v1.4.1) (2021-02-05) + + +### Bug Fixes + +* Anime tags list ([#136](https://github.com/skarab42/marv/issues/136)) ([ad5c6e9](https://github.com/skarab42/marv/commit/ad5c6e9eb6afad5dd0da52cc149cac63f1018212)) +* CORS Allow all origins ([#108](https://github.com/skarab42/marv/issues/108)) ([40fd249](https://github.com/skarab42/marv/commit/40fd249af146aa4cccd1a86732678838eda278fd)) +* Quit process behaviour on Mac ([#119](https://github.com/skarab42/marv/issues/119)) ([b9d989b](https://github.com/skarab42/marv/commit/b9d989b281d2f4dab4d800c196363c6d6f6b9e95)) +* **overlay:** Add missing escape in regexp ([#97](https://github.com/skarab42/marv/issues/97)) ([73e16e9](https://github.com/skarab42/marv/commit/73e16e9ddb5998a28493558f0b8fce2c5b6bf526)) +* **twitch-login:** Fix first login when server port is occupied ([#134](https://github.com/skarab42/marv/issues/134)) ([c2ee324](https://github.com/skarab42/marv/commit/c2ee324a9a97fbf78110122a20c24784c1d23900)) + + +### Features + +* **timeline:** Set audio/video duration on first load ([#139](https://github.com/skarab42/marv/issues/139)) ([1a673de](https://github.com/skarab42/marv/commit/1a673de7272ba518553a98f904c9418e17f58a44)) +* Add EJS support in anime text file ([#135](https://github.com/skarab42/marv/issues/135)) ([33a7519](https://github.com/skarab42/marv/commit/33a75190659291cd1ad214350d2033fd06456ea9)) +* Allow HTML from text file ([#137](https://github.com/skarab42/marv/issues/137)) ([e15cca2](https://github.com/skarab42/marv/commit/e15cca2af9bdf282b1c0bc9bfb16430ca4d8e7d2)) +* Twitch auto reconnect and status ([#110](https://github.com/skarab42/marv/issues/110)) ([797da5c](https://github.com/skarab42/marv/commit/797da5c686a74aaadd3e5ab03811fd7d4780dc7d)) +* **twitch-api:** Add global file/console logger ([#109](https://github.com/skarab42/marv/issues/109)) ([55e7a17](https://github.com/skarab42/marv/commit/55e7a17ae637e2ce1b1bbfc96c78da799e16f3aa)) + + + +# [1.3.0](https://github.com/skarab42/marv/compare/v1.2.2...v1.3.0) (2021-01-23) + + +### Bug Fixes + +* **commands:** Fix empty command message ([57f1973](https://github.com/skarab42/marv/commit/57f1973231eae2ef1e8fcf6c584c210ab7e365d9)) +* **overlay:** Fix multiple variables replacement ([452287d](https://github.com/skarab42/marv/commit/452287d16ae46029cf148f3e2c3292bf17da4952)) + + +### Features + +* **chat-command:** Add EJS support ([6f8da9f](https://github.com/skarab42/marv/commit/6f8da9fc9fc9d87cb965055387b3d63007deb19c)) +* **commands:** Add $user tag for all chat commands ([3f4745c](https://github.com/skarab42/marv/commit/3f4745cbd6a7e96af039817375102c5bc694589b)) +* **commands:** Add chat commands ([65e28cb](https://github.com/skarab42/marv/commit/65e28cbae03b09e50a88ea661e2d3437bb3666f0)) +* **db:** Add message column to Commands table ([4686d5a](https://github.com/skarab42/marv/commit/4686d5a2c4b0a598bb2bbdff6be4274290f52805)) +* **locale:** Update locale ([dcc2e29](https://github.com/skarab42/marv/commit/dcc2e29147249c68f8d6cba426d5b638b1a5a5bc)) + + + +## [1.2.2](https://github.com/skarab42/marv/compare/v1.2.1...v1.2.2) (2021-01-22) + + +### Bug Fixes + +* **socketio:** Fix socket.io CORS origins ([717460e](https://github.com/skarab42/marv/commit/717460ed6c841a069b31743bf5a2c56a024bfbe3)) + + + +## [1.2.1](https://github.com/skarab42/marv/compare/v1.2.0...v1.2.1) (2021-01-21) + + +### Bug Fixes + +* **locale:** Fix language selection ([d579fa1](https://github.com/skarab42/marv/commit/d579fa14f6ab5f75587f57140d7f4a8e73261225)) +* **panel:** Fix undefined current panel when last is removed ([560dc74](https://github.com/skarab42/marv/commit/560dc7430c9bcf1acd00409eaecff51473462a66)) +* **path:** Fix app directory case ([0047b90](https://github.com/skarab42/marv/commit/0047b90ead7a8201c28dbb76a4cc3ba016d5b008)) +* **ui:** Fix undefined currentPanel ([0918334](https://github.com/skarab42/marv/commit/091833423737f32df0b6116386f7047d71ca58d8)) +* **ui:** Fix unsaved change ([e2280af](https://github.com/skarab42/marv/commit/e2280afed52756be19da794cd985e27609c6d567)) + + +### Features + +* **dep:** Add svelte-portal ([21ca4b5](https://github.com/skarab42/marv/commit/21ca4b518f87745ae372a324b255f55388468fed)) +* **locale:** Add edit grid sentences ([901daea](https://github.com/skarab42/marv/commit/901daea04b89ad334a0e7ecbaf48990b9ed022ad)) +* **locale:** Add right click sentences ([5265493](https://github.com/skarab42/marv/commit/526549352a3d243dfe5fc8e037b55606ffd4ad01)) +* **locale:** Update sentences ([82c8e0a](https://github.com/skarab42/marv/commit/82c8e0a3c630193b3a8e34878fe0f6503affbaaf)) +* **panels:** Add set (panels) method ([9fabd36](https://github.com/skarab42/marv/commit/9fabd3679824cda479e1624bc411c9dcffcd847c)) +* **ui:** Add class prop ([e4c2911](https://github.com/skarab42/marv/commit/e4c2911147da15dfd5adf08ed1b18a66958b62ff)) +* **ui:** Add class prop ([01f569b](https://github.com/skarab42/marv/commit/01f569b1b7b6ae3b12a22a4edd631472fe8faa3a)) +* **ui:** Add click to open right menu message ([548c540](https://github.com/skarab42/marv/commit/548c5407efd031af5062aa9b84be5beda4181ee4)) +* **ui:** Add ContexMenu and RenameModal ([4b3624a](https://github.com/skarab42/marv/commit/4b3624a9d4169f7108851ebddeec7838340563dd)) +* **ui:** Add ContextMenu component ([8646a1b](https://github.com/skarab42/marv/commit/8646a1bdefb0abc30ec8b2717269d204bea1e4c0)) +* **ui:** Add ContextMenu component ([c297c25](https://github.com/skarab42/marv/commit/c297c254b2f3b1337aa2964e74c3feee2b98f108)) +* **ui:** Add ContextMenu component ([9afe803](https://github.com/skarab42/marv/commit/9afe803f194490a7b24420d18938c1c04b10d075)) +* **ui:** Add contextmenu event ([1d20103](https://github.com/skarab42/marv/commit/1d20103095bfbd6acfc23c2161b546982ebd8b81)) +* **ui:** Add item separator ([f189d18](https://github.com/skarab42/marv/commit/f189d189137d8c47045016996c3444a362a1612e)) +* **ui:** Add Menu and MenuItem components ([ff8a8da](https://github.com/skarab42/marv/commit/ff8a8da8d65115e181fbf9c3817883e9dce1889c)) +* **ui:** Add Modal and RenameModal ([0723858](https://github.com/skarab42/marv/commit/07238583230bbef8c14063a8cb7ceae698e943a0)) +* **ui:** Add remove panel in context menu ([8d75c26](https://github.com/skarab42/marv/commit/8d75c262729320e90bdd3b8915a485951309444c)) +* **ui:** Add RemoveModal component ([4dcc2f7](https://github.com/skarab42/marv/commit/4dcc2f73a464fdfc52d7ce83eb3f991200b46431)) +* **ui:** Add Separator component ([668c178](https://github.com/skarab42/marv/commit/668c178cd08d014acf318d836a8bc3a27b8bd8d0)) +* **ui:** Allows changing the order of the panels ([f67689c](https://github.com/skarab42/marv/commit/f67689c65eb685799e158aadbafcc3c0c5291193)) +* **ui:** Capitalize menu item ([35759a1](https://github.com/skarab42/marv/commit/35759a103bd879fad2a3eeeb85f9266ccfdb1b53)) +* **ui:** Constrains context menu in the window ([824fa61](https://github.com/skarab42/marv/commit/824fa61cc126bddb77b00316ac535b6480b5712f)) +* **ui:** Create/Add widget on panel creation ([faed14d](https://github.com/skarab42/marv/commit/faed14de678826e8590a3bd2549cb01305964f71)) +* **ui:** Global context menu ([ca2c0f8](https://github.com/skarab42/marv/commit/ca2c0f87dc5b06bac1e0ba4f17e4ddf1eeec6c4e)) +* **ui:** Hide context menu item when not usable ([e90af9d](https://github.com/skarab42/marv/commit/e90af9d133b97354bdd7b539348f8cbb32620ed2)) +* **ui:** Remove sample code ([f788c42](https://github.com/skarab42/marv/commit/f788c4269197836bb70ff240cd6d8f80a4a321fd)) +* **ui:** Remove the edit topbar ([29fa74d](https://github.com/skarab42/marv/commit/29fa74d7de3f2b2ff3e290dfb35e826d64829eb7)) +* **ui:** Switch topbars order ([bb53ead](https://github.com/skarab42/marv/commit/bb53eadcd24b55ce12faa79a2a65aae0885c4c6d)) +* **ui:** Use app ContextMenu ([e5ec039](https://github.com/skarab42/marv/commit/e5ec0393fdb0d8aaa7afa5114a139c5c5cc9345c)) + + + +# [1.1.0](https://github.com/skarab42/marv/compare/v1.0.1...v1.1.0) (2021-01-13) + + +### Bug Fixes + +* **client:** Fix file manager visibility when open from bottom ([adbd287](https://github.com/skarab42/marv/commit/adbd2870b96f807d9687a2dd6380e9518e3ee08e)) +* **timeline:** Fix empty file name ([74b4796](https://github.com/skarab42/marv/commit/74b4796a447067ccb22a3bbdff16f3c8d29874fb)) +* **timeline:** Fix timeline initial items loading ([5943a86](https://github.com/skarab42/marv/commit/5943a86b0ad697cf0b6be14baa66e43cba8dbda1)) + + +### Features + +* **command:** Remove feedback on undefined/disabled command ([fcb5acb](https://github.com/skarab42/marv/commit/fcb5acbc6f08766aaf1c1d7ea8ae57a4043107ac)) +* **electron:** Show main window on second instance ([e0c21de](https://github.com/skarab42/marv/commit/e0c21de1526c210c03112f2e9f1e8014bea3b77c)) +* **locale:** Add remove action confirmation sentences ([b15b8c4](https://github.com/skarab42/marv/commit/b15b8c4fe255fb66389a65b8e2db55ab12933e61)) +* **locale:** Remove undefined/disabled command messages ([a29c887](https://github.com/skarab42/marv/commit/a29c887c527155661fae8646f5fbbf94464250a5)) +* **localization:** Remove trailing dot in titles/buttons translations ([a02879e](https://github.com/skarab42/marv/commit/a02879e51966fdc977828e631c5a3d0096fc9c18)) +* **path:** Change dev user path ([3d358c0](https://github.com/skarab42/marv/commit/3d358c0ebc1243569fc70d55ca0abc75ac1be9ee)) +* **server:** Detect OS language on first start ([76ff78a](https://github.com/skarab42/marv/commit/76ff78a58892d0fcf216d8eb8cba69859e2c8178)) +* **twitch-auth:** Set redirect URL from database ([5b3715a](https://github.com/skarab42/marv/commit/5b3715a2ec462d58d63e27934ac10c74b1d3b303)) +* **widget:** Add remove action confirmation modal ([f8c4e32](https://github.com/skarab42/marv/commit/f8c4e32dad871aee5ec46f762f5d41133d9faca9)) + + + +## [1.0.1](https://github.com/skarab42/marv/compare/v1.0.0...v1.0.1) (2021-01-07) + + + +# [1.0.0](https://github.com/skarab42/marv/compare/v0.16.0...v1.0.0) (2021-01-07) + + + +# [0.16.0](https://github.com/skarab42/marv/compare/v0.15.0...v0.16.0) (2021-01-02) + + + +# [0.15.0](https://github.com/skarab42/marv/compare/v0.14.0...v0.15.0) (2020-12-31) + + + +# [0.14.0](https://github.com/skarab42/marv/compare/v0.13.0...v0.14.0) (2020-12-14) + + +### Bug Fixes + +* boolean value must be set as string ([88cccb1](https://github.com/skarab42/marv/commit/88cccb148dc3cdd188371c1cbb5b1afc840af64e)) +* onStart undefined on server restart (dev only) ([5c757d7](https://github.com/skarab42/marv/commit/5c757d7fac1549ba6a56213a56c2c8965f33045f)) +* tippy z-index ([e960cb7](https://github.com/skarab42/marv/commit/e960cb741c9db53868beaf46b8da5794dbf94aa0)) + + + +# [0.13.0](https://github.com/skarab42/marv/compare/v0.12.0...v0.13.0) (2020-12-11) + + +### Bug Fixes + +* main win created before server started ([33f002f](https://github.com/skarab42/marv/commit/33f002f6e56a6dbecc8d20f9494c274786908714)) + + + +# [0.12.0](https://github.com/skarab42/marv/compare/v0.10.1...v0.12.0) (2020-12-10) + + +### Bug Fixes + +* get rewards if affiliat or partner only ([56e0b19](https://github.com/skarab42/marv/commit/56e0b19781e44eec6e2c44e81f10ee7a0364ae62)) +* infinit request loop to text file ([3b9faa6](https://github.com/skarab42/marv/commit/3b9faa6faa27a74de03022e3b86fa31d75ce309e)) +* pos/size display ([f26c9ce](https://github.com/skarab42/marv/commit/f26c9ced48a31645f1d2e8e89ce24e81756057bb)) +* update inverted value ([6b1ba0a](https://github.com/skarab42/marv/commit/6b1ba0aead891fac961b7b8ea7d598f8c969e1e3)) + + + +## [0.10.1](https://github.com/skarab42/marv/compare/v0.10.0...v0.10.1) (2020-12-06) + + +### Bug Fixes + +* get all followers only when the db is empty ([fad19b9](https://github.com/skarab42/marv/commit/fad19b9a50d998854052ee9f786ec9b7bc94d3a4)) +* get followers when not connected ([3fa476b](https://github.com/skarab42/marv/commit/3fa476b92ebceb3b3e86c5210696194aa8e211aa)) +* request twitch api without login ([fe4e168](https://github.com/skarab42/marv/commit/fe4e168be9e469306a532fdc6e96e70518090574)) + + + +# [0.10.0](https://github.com/skarab42/marv/compare/v0.9.3...v0.10.0) (2020-12-06) + + +### Bug Fixes + +* create DB on first start ([fb15c2e](https://github.com/skarab42/marv/commit/fb15c2e907206f5013f3c540317cabd5105e378f)) +* missing tippy bottom style ([f73c98e](https://github.com/skarab42/marv/commit/f73c98e0869926083284e20de7c18afa046019f4)) +* NaN value when not in live ([b27552c](https://github.com/skarab42/marv/commit/b27552c9f3f6b9c2bb5691e5e1bdbfa02f6a1a30)) + + + +## [0.9.3](https://github.com/skarab42/marv/compare/v0.9.2...v0.9.3) (2020-12-04) + + +### Bug Fixes + +* offline follow spam ([adbf580](https://github.com/skarab42/marv/commit/adbf5803ea57860ad9f4941d564d02f9d1314ba0)) +* update command by id ([b97a8cf](https://github.com/skarab42/marv/commit/b97a8cfad4921dfa79a6234ff60d113acabc64a2)) + + + +## [0.9.2](https://github.com/skarab42/marv/compare/v0.9.1...v0.9.2) (2020-12-03) + + +### Bug Fixes + +* update panel after action is removed ([ced7ec6](https://github.com/skarab42/marv/commit/ced7ec6cd1d41968b4702354eefb5a13c4e2fd61)) + + + +## [0.9.1](https://github.com/skarab42/marv/compare/v0.9.0...v0.9.1) (2020-11-30) + + +### Bug Fixes + +* decodeURI ([4d47cfc](https://github.com/skarab42/marv/commit/4d47cfc7494fd51be6cc6f73e6cb7b1db96a1e81)) +* open minified switch ([7b3e277](https://github.com/skarab42/marv/commit/7b3e27719831561ed02b4ce092cf83531339f0d4)) + + + +# [0.9.0](https://github.com/skarab42/marv/compare/v0.8.2...v0.9.0) (2020-11-29) + + +### Bug Fixes + +* add new line at end of the file ([24cc915](https://github.com/skarab42/marv/commit/24cc9159f06dfa3180bbbe1bcbc2be69315a7f68)) +* Force window to be shown by default / Add icon for MacOS ([2b0fba5](https://github.com/skarab42/marv/commit/2b0fba5697fb357ad1dcc6ea890a9e2a0f714c56)) +* input position ([5afec30](https://github.com/skarab42/marv/commit/5afec3075255618fa894971b7a9272d222b88f42)) +* revert `show` to false ([67eac0e](https://github.com/skarab42/marv/commit/67eac0efbbe98b8970ab29f6a9e6904d6df324db)) +* single instance lock ([c7cc59e](https://github.com/skarab42/marv/commit/c7cc59e3e513e2f84b0dda2ca26bc4e257690fa9)) + + + +## [0.8.2](https://github.com/skarab42/marv/compare/v0.8.1...v0.8.2) (2020-11-27) + + +### Bug Fixes + +* first start info checkbox ([98d92b5](https://github.com/skarab42/marv/commit/98d92b587f07ec81e4e65dc4d819cb567519e9df)) +* user display_name ([dc1f610](https://github.com/skarab42/marv/commit/dc1f610eff03d2093efb579a58aa56bef635c663)) +* user store undefined when never logged to Twitch ([337aca9](https://github.com/skarab42/marv/commit/337aca952573e18621e797ae9f207969d844182c)) + + + +## [0.8.1](https://github.com/skarab42/marv/compare/v0.8.0...v0.8.1) (2020-11-27) + + + +# [0.8.0](https://github.com/skarab42/marv/compare/v0.7.0...v0.8.0) (2020-11-27) + + +### Reverts + +* Revert "add db path" ([dd98ff6](https://github.com/skarab42/marv/commit/dd98ff6862f41441ed95e5babd5d5b3a51099294)) + + + +# [0.7.0](https://github.com/skarab42/marv/compare/v0.6.1...v0.7.0) (2020-11-26) + + + +## [0.6.1](https://github.com/skarab42/marv/compare/v0.6.0...v0.6.1) (2020-11-26) + + +### Reverts + +* Revert "v0.6.0" ([d53c0ff](https://github.com/skarab42/marv/commit/d53c0ffcf9cb0dcd4da6946250ed7f83b1119532)) +* Revert "v0.6.0" ([5855aed](https://github.com/skarab42/marv/commit/5855aed356dd54a3f29015ed4ae80cfe3704a0dd)) + + + +# [0.6.0](https://github.com/skarab42/marv/compare/v0.5.0...v0.6.0) (2020-11-26) + + +### Bug Fixes + +* avoid chat reload when no channel change ([3854158](https://github.com/skarab42/marv/commit/38541588f8bb777dc13bb8a44798978d00b93137)) +* get stream return null ([e40a404](https://github.com/skarab42/marv/commit/e40a404c24c44fb6ccdc4c4dc5d72c8b1f252dab)) +* input spacing ([8e9a4f5](https://github.com/skarab42/marv/commit/8e9a4f59312526cce5fe915eeef275f490779124)) +* modal top offset when in electron window ([25d9505](https://github.com/skarab42/marv/commit/25d9505a65ef1923017c8c342d4041e566bbe9d6)) +* modal top offset when in electron window ([c9b2da4](https://github.com/skarab42/marv/commit/c9b2da4f9676cb3ca5d4f9157c4242e0f57dd179)) +* stream update ([10bb871](https://github.com/skarab42/marv/commit/10bb8710497454fa07822095bc13ed522162a777)) +* systray icon for window OS ([bd8db9a](https://github.com/skarab42/marv/commit/bd8db9ac499dd4ab66799970db3bae504c84742e)) +* unused prop ([d26b212](https://github.com/skarab42/marv/commit/d26b21250fa2aabaae91184282263c4bc5825f41)) +* version number up to date ([779e676](https://github.com/skarab42/marv/commit/779e6769cecacbbdc96de8d7268d70e2f4ae5c6a)) +* widget config / clone deep ([c0e70a7](https://github.com/skarab42/marv/commit/c0e70a76c534da9315fd415a22f9ecab7bf9c2e0)) + + + +# [0.5.0](https://github.com/skarab42/marv/compare/v0.4.4...v0.5.0) (2020-11-24) + + +### Bug Fixes + +* drawer top offset when in electron win ([d695100](https://github.com/skarab42/marv/commit/d695100e2fc516c364ff0d759f3e3e76c59e4e04)) +* hide input checkbox ([aa2d770](https://github.com/skarab42/marv/commit/aa2d77085489b40561f11fcca891c45a35eca156)) +* missing default value argument ([b19b73a](https://github.com/skarab42/marv/commit/b19b73a85215071c04b79712dc97515784c9c8da)) +* remove file ([151f06b](https://github.com/skarab42/marv/commit/151f06b82e991cc686e6d59df5a4cf7d3f73d368)) +* undefined anime duration ([5b40a82](https://github.com/skarab42/marv/commit/5b40a8246356e0228ab2e0445b784e7bdf158de1)) +* widget spiner offset ([c5f852e](https://github.com/skarab42/marv/commit/c5f852eee0a2de4b37764a7bf5326366c610101d)) + + + +## [0.4.4](https://github.com/skarab42/marv/compare/v0.4.3...v0.4.4) (2020-11-20) + + + +## [0.4.3](https://github.com/skarab42/marv/compare/v0.4.2...v0.4.3) (2020-11-20) + + + +## [0.4.2](https://github.com/skarab42/marv/compare/v0.4.1...v0.4.2) (2020-11-20) + + + +## [0.4.1](https://github.com/skarab42/marv/compare/v0.4.0...v0.4.1) (2020-11-20) + + + +# [0.4.0](https://github.com/skarab42/marv/compare/v0.3.3...v0.4.0) (2020-11-20) + + +### Bug Fixes + +* build tailwind before runing watch mode ([0c55a4b](https://github.com/skarab42/marv/commit/0c55a4b8d2e854532ed0c1f530cab4d7c9cbdc20)) +* client URL ([1d8a43c](https://github.com/skarab42/marv/commit/1d8a43cd47719ba26f6c96a0b5aace26084591ce)) +* remove actions when widget/panel removed ([d6aa5c5](https://github.com/skarab42/marv/commit/d6aa5c57bc8dd9c9ec5d7586d9e1fe228f01bcdc)) +* removed absolute paths from stores ([7e84e27](https://github.com/skarab42/marv/commit/7e84e273007e0079d77110feb337e94ff18db619)) +* tailwind build order ([b91c552](https://github.com/skarab42/marv/commit/b91c552370e43b5128f55ec5bb7c89d1a27f8b2b)) + + + +## [0.3.3](https://github.com/skarab42/marv/compare/v0.3.2...v0.3.3) (2020-11-19) + + + +## [0.3.2](https://github.com/skarab42/marv/compare/v0.3.1...v0.3.2) (2020-11-19) + + + +# [0.3.0](https://github.com/skarab42/marv/compare/b4f190ef7641c5260cf24de813d622a914a63809...v0.3.0) (2020-11-19) + + +### Bug Fixes + +* app quit ([2396fb5](https://github.com/skarab42/marv/commit/2396fb5d0428124d196b437a00be36b8469c49a8)) +* destroy modal on conexion lost ([fd94e73](https://github.com/skarab42/marv/commit/fd94e73e59b7a5801baf944847ab5b8bfb193c0c)) +* empty scene ([4cccb02](https://github.com/skarab42/marv/commit/4cccb02098aaaf9938ad315dd6d42a944de0c78c)) +* i18n ([8ba2806](https://github.com/skarab42/marv/commit/8ba280629110f0353c50d7d41691a4ca97fc7b60)) +* i18n prefix ([b441832](https://github.com/skarab42/marv/commit/b441832fe8615741da722cdc264d577e6d99025d)) +* missing input attr -> accept ([07df5f2](https://github.com/skarab42/marv/commit/07df5f25c71b79241f20fec8484074f700d79788)) +* panel update ([4d25121](https://github.com/skarab42/marv/commit/4d25121521fe67a3b3a4b2aaf1ad9983976e6ea6)) +* passive event and stop propagation ([b4f190e](https://github.com/skarab42/marv/commit/b4f190ef7641c5260cf24de813d622a914a63809)) +* responsive ([fba71c7](https://github.com/skarab42/marv/commit/fba71c7820cba7a00fb8ec605e572e66763cd15c)) +* responsive ([c3c2a11](https://github.com/skarab42/marv/commit/c3c2a1152b54429f7e97fee74c08c13637f64ad6)) +* timeline min/max seek ([55b1dd8](https://github.com/skarab42/marv/commit/55b1dd8fb52665a6af6652d6055259fa3075d8b1)) +* timeline seek and out ouf range visibility ([dc20100](https://github.com/skarab42/marv/commit/dc20100ae6e214c25f32223849fd2ff77cfa198d)) +* timeline text update ([cb701d4](https://github.com/skarab42/marv/commit/cb701d45d35e64c0884b3f575f79553efa9c4320)) +* undefined panel id when no panel is selected ([3739f37](https://github.com/skarab42/marv/commit/3739f374413fbe9f7f05e1e06b1e08ed2f373f42)) +* undefined wrapper !!! ([6fb9a4a](https://github.com/skarab42/marv/commit/6fb9a4af04bb0988e223f5d319cb1fb23015265f)) +* undefined wrapper on resize !?!? ([0b60024](https://github.com/skarab42/marv/commit/0b60024ce8edefddd89f788cda4661b284150283)) +* upload path ([cc39adb](https://github.com/skarab42/marv/commit/cc39adba0b6e7152a49845c91a9de94858d940c3)) +* widget label i18n ([105d8f9](https://github.com/skarab42/marv/commit/105d8f9249f4cade3c3c2dc22d348973ea574680)) + + + diff --git a/README.md b/README.md index ad36be27..cb7f7b81 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,20 @@ -# Marv - Twitch Bot +# Marv // StreamDeck Like // Twitch Bot WIP Projet développé en live sur la chaîne [twitch.tv/skarab42](https://www.twitch.tv/skarab42). -# Project setup +![Marv - v0.6.01](docs/images/screenshot.png) + +# Installation + +- Download and install from [here](https://github.com/skarab42/marv/releases) (win/mac/linux). + +## OBS WebSocket + +- For OBS to work with Marv you need to install [obs-websocket](https://github.com/Palakis/obs-websocket/releases). + +# Contribute ?! + +## Project setup ```bash # Clone this repository @@ -13,6 +25,8 @@ cd marv # install all dependencies yarn install +yarn build +yarn app:build # run application in development mode yarn watch @@ -22,7 +36,26 @@ yarn start # build application in production mode yarn build +yarn app:build # lint project yarn lint ``` + +## How to build with npm (easier from ubuntu?): + +``` +cd marv +npm install +npm run tailwind:build --prod +npm run client:build +npm run app:build +``` + +Credit: thermo74 :) + +## Translations + +- Spanish by TerminabloxHD +- French by Skarab42 +- English by Skarab42 diff --git a/app/client/css/index.css b/app/client/css/index.css deleted file mode 100644 index 5edc689f..00000000 --- a/app/client/css/index.css +++ /dev/null @@ -1,211 +0,0 @@ -[data-simplebar] { - position: relative; - flex-direction: column; - flex-wrap: wrap; - justify-content: flex-start; - align-content: flex-start; - align-items: flex-start; -} - -.simplebar-wrapper { - overflow: hidden; - width: inherit; - height: inherit; - max-width: inherit; - max-height: inherit; -} - -.simplebar-mask { - direction: inherit; - position: absolute; - overflow: hidden; - padding: 0; - margin: 0; - left: 0; - top: 0; - bottom: 0; - right: 0; - width: auto !important; - height: auto !important; - z-index: 0; -} - -.simplebar-offset { - direction: inherit !important; - box-sizing: inherit !important; - resize: none !important; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - padding: 0; - margin: 0; - -webkit-overflow-scrolling: touch; -} - -.simplebar-content-wrapper { - direction: inherit; - box-sizing: border-box !important; - position: relative; - display: block; - height: 100%; /* Required for horizontal native scrollbar to not appear if parent is taller than natural height */ - width: auto; - max-width: 100%; /* Not required for horizontal scroll to trigger */ - max-height: 100%; /* Needed for vertical scroll to trigger */ - scrollbar-width: none; - -ms-overflow-style: none; -} - -.simplebar-content-wrapper::-webkit-scrollbar, -.simplebar-hide-scrollbar::-webkit-scrollbar { - width: 0; - height: 0; -} - -.simplebar-content:before, -.simplebar-content:after { - content: ' '; - display: table; -} - -.simplebar-placeholder { - max-height: 100%; - max-width: 100%; - width: 100%; - pointer-events: none; -} - -.simplebar-height-auto-observer-wrapper { - box-sizing: inherit !important; - height: 100%; - width: 100%; - max-width: 1px; - position: relative; - float: left; - max-height: 1px; - overflow: hidden; - z-index: -1; - padding: 0; - margin: 0; - pointer-events: none; - flex-grow: inherit; - flex-shrink: 0; - flex-basis: 0; -} - -.simplebar-height-auto-observer { - box-sizing: inherit; - display: block; - opacity: 0; - position: absolute; - top: 0; - left: 0; - height: 1000%; - width: 1000%; - min-height: 1px; - min-width: 1px; - overflow: hidden; - pointer-events: none; - z-index: -1; -} - -.simplebar-track { - z-index: 1; - position: absolute; - right: 0; - bottom: 0; - pointer-events: none; - overflow: hidden; -} - -[data-simplebar].simplebar-dragging .simplebar-content { - pointer-events: none; - user-select: none; - -webkit-user-select: none; -} - -[data-simplebar].simplebar-dragging .simplebar-track { - pointer-events: all; -} - -.simplebar-scrollbar { - position: absolute; - left: 0; - right: 0; - min-height: 10px; -} - -.simplebar-scrollbar:before { - position: absolute; - content: ''; - background: black; - border-radius: 7px; - left: 2px; - right: 2px; - opacity: 0; - transition: opacity 0.2s linear; -} - -.simplebar-scrollbar.simplebar-visible:before { - /* When hovered, remove all transitions from drag handle */ - opacity: 0.5; - transition: opacity 0s linear; -} - -.simplebar-track.simplebar-vertical { - top: 0; - width: 11px; -} - -.simplebar-track.simplebar-vertical .simplebar-scrollbar:before { - top: 2px; - bottom: 2px; -} - -.simplebar-track.simplebar-horizontal { - left: 0; - height: 11px; -} - -.simplebar-track.simplebar-horizontal .simplebar-scrollbar:before { - height: 100%; - left: 2px; - right: 2px; -} - -.simplebar-track.simplebar-horizontal .simplebar-scrollbar { - right: auto; - left: 0; - top: 2px; - height: 7px; - min-height: 0; - min-width: 10px; - width: auto; -} - -/* Rtl support */ -[data-simplebar-direction='rtl'] .simplebar-track.simplebar-vertical { - right: auto; - left: 0; -} - -.hs-dummy-scrollbar-size { - direction: rtl; - position: fixed; - opacity: 0; - visibility: hidden; - height: 500px; - width: 500px; - overflow-y: hidden; - overflow-x: scroll; -} - -.simplebar-hide-scrollbar { - position: fixed; - left: 0; - visibility: hidden; - overflow-y: scroll; - scrollbar-width: none; - -ms-overflow-style: none; -} diff --git a/app/client/overlay.html b/app/client/overlay.html index 33644388..7d6c3f20 100644 --- a/app/client/overlay.html +++ b/app/client/overlay.html @@ -5,7 +5,6 @@ overlay - marv - diff --git a/app/main/index.js b/app/main/index.js index f768b6d6..0a93ce0e 100644 --- a/app/main/index.js +++ b/app/main/index.js @@ -2,15 +2,27 @@ const { app } = require("electron"); const server = require("./server"); -const tray = require("./tray"); -app.requestSingleInstanceLock() || app.quit(); +let mainWindow; -app.on("window-all-closed", (event) => { - event.preventDefault(); -}); - -app.whenReady().then(() => { - server.start(); +async function onServerReady() { + const tray = require("./tray"); + mainWindow = require("./window/mainWindow"); + const settings = require("../server/libs/settings"); + mainWindow({ showOnLoad: await settings.get("app.openOnStartup") }); tray(); -}); +} + +function init() { + app.on("window-all-closed", (event) => { + event.preventDefault(); + }); + + app.whenReady().then(() => { + server.start(onServerReady); + }); +} + +app.requestSingleInstanceLock() ? init() : app.quit(); + +app.on("second-instance", () => mainWindow()); diff --git a/app/main/server.js b/app/main/server.js index 91902439..e433c103 100644 --- a/app/main/server.js +++ b/app/main/server.js @@ -1,10 +1,10 @@ const { fork } = require("child_process"); -const store = require("../stores"); +const { watch } = require("../utils"); +const quit = require("./quit"); const chalk = require("chalk"); const path = require("path"); -const dev = !store.app.get("production"); -const colors = new chalk.Instance({ level: 2 }); +const colors = new chalk.Instance({ level: 3 }); const rootPath = path.resolve(__dirname, "../.."); const serverPath = path.join(__dirname, "../server"); const serverBin = path.join(serverPath, "index.js"); @@ -25,18 +25,24 @@ function stderr(buffer) { console.error(colors.redBright("[server]"), bufferToString(buffer)); } -function start() { +function start(onStared = null) { if (server) return server; const argv = process.argv.slice(2); - server = fork(serverBin, argv, { stdio: "pipe" }); + server = fork(serverBin, argv, { stdio: ["pipe", "pipe", "pipe", "ipc"] }); server.stderr.on("data", stderr); server.stdout.on("data", stdout); server.on("close", (code) => { stdout(`exited with code ${code || 0}`); + code === 42 && quit(); }); + + onStared && + server.on("message", (message) => { + if (message === "started") onStared(); + }); } function restart() { @@ -53,7 +59,7 @@ function stop() { server = null; } -if (dev) { +if (watch) { const icon = colors.green("↺"); const chokidar = require("chokidar"); const watcher = chokidar.watch(path.join(serverPath, "**/*")); diff --git a/app/main/tray.js b/app/main/tray.js index da5f6e28..bf3103da 100644 --- a/app/main/tray.js +++ b/app/main/tray.js @@ -1,19 +1,22 @@ -const { _ } = require("../server/libs/i18next"); +const { init: i18next, _ } = require("../server/libs/i18next"); +const getTrayIconByPlatform = require("./window/trayIcon"); +const { staticPath, fingerprint } = require("../utils"); +const { getServerURL } = require("../server/utils"); +const settings = require("../server/libs/settings"); +const mainWindow = require("./window/mainWindow"); +const chatWindow = require("./window/chatWindow"); const { Tray, Menu } = require("electron"); -const createWindow = require("./window"); const capitalize = require("capitalize"); -const store = require("../stores"); const quit = require("./quit"); +const path = require("path"); const open = require("open"); -const { name, version, icon } = store.app.getAll(); -const fingerprint = `${capitalize(name)} v${version}`; +const icon = getTrayIconByPlatform(); let tray = null; -function openInBrowser() { - const { host, port } = store.server.getAll(); - open(`http://${host}:${port}`); +async function openInBrowser() { + open(await getServerURL()); } function createMenu() { @@ -26,17 +29,28 @@ function createMenu() { }, { label: _("sentences.open-in-window"), - click: () => createWindow(), + click: () => mainWindow(), + }, + { + label: _("sentences.open-twitch-chat-window"), + click: async () => { + chatWindow({ + channel: await settings.get("twitch.currentChannel", ""), + }); + }, }, { type: "separator" }, { label: capitalize(_("words.quit")), click: () => quit() }, ]); } -function createTray() { - tray = new Tray(icon); +async function createTray() { + await i18next(); + + tray = new Tray(path.join(staticPath, icon)); tray.setToolTip(fingerprint); + tray.on("click", mainWindow); tray.setContextMenu(createMenu()); tray.setIgnoreDoubleClickEvents(true); diff --git a/app/main/window/chatWindow.js b/app/main/window/chatWindow.js new file mode 100644 index 00000000..0201d8a5 --- /dev/null +++ b/app/main/window/chatWindow.js @@ -0,0 +1,109 @@ +const openLinkInBrowser = require("./openLinkInBrowser"); +const { getServerURL } = require("../../server/utils"); +const { staticPath, watch } = require("../../utils"); +const webPreferences = require("./webPreferences"); +const { BrowserWindow } = require("electron"); +const storeBounds = require("./storeBounds"); +const hideOnClose = require("./hideOnClose"); +const path = require("path"); + +let win = null; +let currentChannel = null; + +function loadChat(win, channel) { + if (currentChannel === channel) return; + win.loadURL(`https://www.twitch.tv/embed/${channel}/chat?parent=localhost`); + currentChannel = channel; +} + +module.exports = function chatWindow({ channel, showOnLoad = true } = {}) { + if (win) { + loadChat(win, channel); + return win.show(); + } + + win = new BrowserWindow({ + width: 800, + height: 600, + show: false, + frame: false, + icon: path.join(staticPath, "icon.png"), + webPreferences: { ...webPreferences, devTools: watch }, + }); + + hideOnClose(win); + openLinkInBrowser(win); + storeBounds({ win, name: "chat" }); + + win.webContents.on("did-finish-load", async () => { + const serverURL = await getServerURL(); + + win.webContents.insertCSS(` + #root > div.tw-top-0 { + top: 30px !important; + } + #electron-titlebar { + display: flex; + font-size: 14px; + user-select: none; + align-items: center; + color: rgb(226, 232, 240); + background-color: rgb(26, 32, 44); + } + #electron-titlebar > div { + display: flex; + height: 29px; + padding-left: 8px; + padding-right: 8px; + align-items: center; + } + #electron-titlebar > div.icon { + display: flex; + } + #electron-titlebar > div.title { + padding: 1px 0; + flex: 1 1 auto; + display: flex; + height: 24px; + } + #electron-titlebar > div.title > div { + flex: 1 1 auto; + -webkit-app-region: drag; + } + #electron-titlebar > div.cross { + cursor: pointer; + } + #electron-titlebar > div.cross:hover { + background-color: rgb(197, 48, 48); + } + `); + win.webContents.executeJavaScript(` + const $html = document.querySelector("html"); + const $body = document.querySelector("body"); + $html.classList.toggle("tw-root--theme-dark", true); + $html.classList.toggle("tw-root--theme-light", false); + const $titlebar = document.createElement('div'); + const $icon = document.createElement('div'); + const $title = document.createElement('div'); + const $cross = document.createElement('div'); + const $iconSVG = document.createElement('img'); + $titlebar.setAttribute('id', 'electron-titlebar'); + $iconSVG.setAttribute('src', '${serverURL}/icon.svg'); + $iconSVG.setAttribute('height', '16px'); + $icon.classList.add('icon'); + $title.classList.add('title'); + $cross.classList.add('cross'); + $icon.append($iconSVG); + $title.innerHTML = '
${channel} - Twitch chat
'; + $cross.innerHTML = '✕'; + $titlebar.append($icon, $title, $cross); + $cross.addEventListener('click', () => window.close()); + $body.prepend($titlebar); + `); + showOnLoad && win.show(); + }); + + win.removeMenu(); + loadChat(win, channel); + watch && win.webContents.openDevTools(); +}; diff --git a/app/main/window/hideOnClose.js b/app/main/window/hideOnClose.js index f1ff1b03..99ff22ff 100644 --- a/app/main/window/hideOnClose.js +++ b/app/main/window/hideOnClose.js @@ -1,10 +1,25 @@ const { app } = require("electron"); +const quit = require("../quit"); + + module.exports = function hideOnClose(win) { + let willQuitApp = false; + win.on("close", (event) => { + + // Quit on Cmd + Q on Mac + if (willQuitApp && process.platform === 'darwin') { + quit(); + } + if (!app.__isQuitting) { event.preventDefault(); win.hide(); } }); + + // Detect If the user decide to quit app + app.on('before-quit', () => willQuitApp = true); + }; diff --git a/app/main/window/index.js b/app/main/window/index.js deleted file mode 100644 index 3560308f..00000000 --- a/app/main/window/index.js +++ /dev/null @@ -1,33 +0,0 @@ -const { BrowserWindow } = require("electron"); -const hideOnClose = require("./hideOnClose"); -const store = require("../../stores"); - -let win = null; - -const icon = store.app.get("icon"); -const devTools = !store.app.get("production"); - -function createWindow() { - if (win) { - return win.show(); - } - - win = new BrowserWindow({ - icon, - width: 800, - height: 600, - show: false, - webPreferences: { devTools }, - }); - - hideOnClose(win); - - win.webContents.once("did-finish-load", () => { - win.show(); - }); - - win.loadURL("http://localhost:4242/"); - devTools && win.webContents.openDevTools(); -} - -module.exports = createWindow; diff --git a/app/main/window/mainWindow.js b/app/main/window/mainWindow.js new file mode 100644 index 00000000..0445d6d6 --- /dev/null +++ b/app/main/window/mainWindow.js @@ -0,0 +1,37 @@ +const openLinkInBrowser = require("./openLinkInBrowser"); +const { getServerURL } = require("../../server/utils"); +const { staticPath, watch } = require("../../utils"); +const webPreferences = require("./webPreferences"); +const { BrowserWindow } = require("electron"); +const storeBounds = require("./storeBounds"); +const hideOnClose = require("./hideOnClose"); +const path = require("path"); + +let win = null; + +module.exports = async function createWindow({ showOnLoad = true } = {}) { + if (win) { + return win.show(); + } + + win = new BrowserWindow({ + width: 800, + height: 600, + show: false, + frame: false, + icon: path.join(staticPath, "icon.png"), + webPreferences: { ...webPreferences, devTools: watch }, + }); + + hideOnClose(win); + openLinkInBrowser(win); + storeBounds({ win, name: "main" }); + + win.webContents.once("did-finish-load", () => { + showOnLoad && win.show(); + }); + + win.removeMenu(); + win.loadURL(`${await getServerURL()}?electron`); + watch && win.webContents.openDevTools(); +}; diff --git a/app/main/window/openLinkInBrowser.js b/app/main/window/openLinkInBrowser.js new file mode 100644 index 00000000..27410cf6 --- /dev/null +++ b/app/main/window/openLinkInBrowser.js @@ -0,0 +1,8 @@ +const open = require("open"); + +module.exports = function openLinkInBrowser(win) { + win.webContents.on("new-window", (event, url) => { + event.preventDefault(); + open(url); + }); +}; diff --git a/app/main/window/storeBounds.js b/app/main/window/storeBounds.js new file mode 100644 index 00000000..81fb0fe5 --- /dev/null +++ b/app/main/window/storeBounds.js @@ -0,0 +1,28 @@ +const create = require("../../stores/create"); + +const defaults = { + bounds: { + width: 800, + height: 600, + }, +}; + +module.exports = function storeBounds({ win, name, delay = 500 } = {}) { + const store = create(`windows/${name}`, { defaults }); + + let timeout = null; + + const loadBounds = () => win.setBounds(store.get("bounds")); + const updateBounds = () => store.set("bounds", win.getBounds()); + + const updateBoundsDelay = () => { + timeout && clearTimeout(timeout); + timeout = setTimeout(updateBounds, delay); + }; + + win.on("show", loadBounds); + win.on("hide", updateBounds); + win.on("close", updateBounds); + win.on("move", updateBoundsDelay); + win.on("resize", updateBoundsDelay); +}; diff --git a/app/main/window/trayIcon.js b/app/main/window/trayIcon.js new file mode 100644 index 00000000..95f90c83 --- /dev/null +++ b/app/main/window/trayIcon.js @@ -0,0 +1,16 @@ +module.exports = function getTrayIconByPlatform() { + let icon; + switch (process.platform) { + default: + icon = "icon.png"; + break; + case "win32": + icon = "icon.ico"; + break; + case "darwin": + icon = "icon_macos.png"; + break; + } + + return icon; +}; diff --git a/app/main/window/webPreferences.js b/app/main/window/webPreferences.js new file mode 100644 index 00000000..1f50e0f3 --- /dev/null +++ b/app/main/window/webPreferences.js @@ -0,0 +1,11 @@ +module.exports = { + nodeIntegration: false, + nodeIntegrationInWorker: false, + nodeIntegrationInSubFrames: false, + worldSafeExecuteJavaScript: true, + experimentalFeatures: false, + enableRemoteModule: false, + contextIsolation: true, + webviewTag: false, + sandbox: false, +}; diff --git a/app/package.json b/app/package.json index ec9b0a30..1b8826c1 100644 --- a/app/package.json +++ b/app/package.json @@ -1,27 +1,39 @@ { "name": "marv", - "version": "0.3.3", + "version": "1.4.1", "description": "Marv - Twitch Bot", "repository": "github:skarab42/marv", "author": "skarab42 ", "license": "MIT", "main": "main/index.js", "dependencies": { + "axios": "^0.21.1", "body-parser": "^1.19.0", "capitalize": "^2.0.3", "chalk": "^4.1.0", "chokidar": "^3.4.3", + "clone-deep": "^4.0.1", "conf": "^7.1.2", + "dot-prop": "^6.0.1", + "ejs": "^3.1.5", "env-paths": "^2.2.0", "fs-extra": "^9.0.1", + "get-system-fonts": "^2.0.2", "i18next": "^19.8.3", "i18next-fs-backend": "^1.0.7", "mime": "^2.4.6", "obs-websocket-js": "^4.0.2", "open": "^7.3.0", "polka": "^0.5.2", + "sequelize": "^6.3.5", "sirv": "^1.0.7", - "socket.io": "^2.3.0", + "socket.io": "^2.4.0", + "sqlite3": "^5.0.0", + "twitch": "^4.3.1", + "twitch-auth": "^4.3.1", + "twitch-chat-client": "^4.3.1", + "twitch-pubsub-client": "^4.3.2", + "umzug": "^3.0.0-beta.12", "uuid": "^8.3.1" } } diff --git a/app/server/api/app.js b/app/server/api/app.js new file mode 100644 index 00000000..816d005b --- /dev/null +++ b/app/server/api/app.js @@ -0,0 +1,30 @@ +const { getSystemFonts, getUsedFonts } = require("../libs/files"); +const settings = require("../libs/settings"); + +module.exports = { + quit: () => { + process.exit(42); + }, + getOS: () => { + return process.platform; + }, + getFonts: async () => { + return (await getSystemFonts()).fontNames; + }, + loadFont: (url) => { + const io = require("../libs/socket.io")(); + if (!io.__overlaySocket) return; + io.__overlaySocket.emit("loadFont", url); + }, + getUsedFonts: () => { + return getUsedFonts(); + }, + getSettings: async () => { + const app = await settings.getAll("app."); + const server = await settings.getAll("server."); + return { ...app, server }; + }, + setSetting: (key, value) => { + return settings.set(`app.${key}`, value); + }, +}; diff --git a/app/server/api/command.js b/app/server/api/command.js new file mode 100644 index 00000000..e75c5f03 --- /dev/null +++ b/app/server/api/command.js @@ -0,0 +1,10 @@ +const settings = require("../libs/settings"); + +module.exports = { + setPrefix: (prefix) => { + return settings.set("command.prefix", prefix, "string"); + }, + getSettings: async () => { + return await settings.getAll("command."); + }, +}; diff --git a/app/server/api/files.js b/app/server/api/files.js index 93f9213a..baff25df 100644 --- a/app/server/api/files.js +++ b/app/server/api/files.js @@ -13,5 +13,6 @@ module.exports = { return Promise.resolve(file); }); }, + update: (file, data) => files.update(file, data), getFileList: () => files.getFileList(), }; diff --git a/app/server/api/i18next.js b/app/server/api/i18next.js index 5354b8aa..926536da 100644 --- a/app/server/api/i18next.js +++ b/app/server/api/i18next.js @@ -1,9 +1,10 @@ -const stores = require("../../stores"); -const { i18next } = require("../libs/i18next"); +const settings = require("../libs/settings"); +const { i18next, getConfig } = require("../libs/i18next"); module.exports = { + getConfig: async () => await getConfig(), changeLanguage: (language) => { i18next.changeLanguage(language); - stores.i18next.set("lng", language); + settings.set("app.language", language); }, }; diff --git a/app/server/api/obs.js b/app/server/api/obs.js index f56d408f..41755a64 100644 --- a/app/server/api/obs.js +++ b/app/server/api/obs.js @@ -1,9 +1,17 @@ -const stores = require("../../stores"); +const settings = require("../libs/settings"); const obs = require("../libs/obs"); +function getSettings() { + return settings.getAll("obs."); +} + module.exports = { - connect: () => obs.connect(stores.obs.getAll()), + connect: async () => obs.connect(await getSettings()), disconnect: () => obs.disconnect(), getState: () => obs.getState(), emit: (type, ...args) => obs.send(type, ...args), + getSettings, + setSetting: (key, value) => { + return settings.set(`obs.${key}`, value); + }, }; diff --git a/app/server/api/overlay.js b/app/server/api/overlay.js new file mode 100644 index 00000000..0fbe200d --- /dev/null +++ b/app/server/api/overlay.js @@ -0,0 +1,7 @@ +const io = require("../libs/socket.io"); + +module.exports = { + isConnected() { + return !!io().__overlaySocket; + }, +}; diff --git a/app/server/api/panels.js b/app/server/api/panels.js index 488e869b..6adbc721 100644 --- a/app/server/api/panels.js +++ b/app/server/api/panels.js @@ -1,11 +1,17 @@ const panels = require("../libs/panels"); module.exports = { + getAll: () => panels.getAll(), add() { const panel = panels.add(); this.notify("panels.add", panel); return panel; }, + set(newPanels) { + const results = panels.set(newPanels); + this.notify("panels.set", newPanels); + return results; + }, remove(panel) { const pos = panels.remove(panel); this.notify("panels.remove", panel, pos); @@ -22,10 +28,27 @@ module.exports = { this.notify("panels.update", payload.panel); return payload; }, + duplicateWidget(payload) { + const result = panels.duplicateWidget(payload); + this.notify("panels.addWidget", result); + this.notify("panels.update", result.panel); + return result; + }, + moveWidgetToPanel(payload) { + const results = panels.moveWidgetToPanel(payload); + this.notify("panels.update", results[0].panel); + this.notify("panels.update", results[1].panel); + return results; + }, removeWidget(targetPanel, widget) { const payload = panels.removeWidget(targetPanel, widget); this.notify("panels.removeWidget", payload); this.notify("panels.update", payload.panel); return payload; }, + removeWidgetComponent(panel, widget) { + const payload = panels.removeWidgetComponent(panel, widget); + this.notify("panels.update", payload.panel); + return payload; + }, }; diff --git a/app/server/api/settings.js b/app/server/api/settings.js new file mode 100644 index 00000000..bdfcbb5e --- /dev/null +++ b/app/server/api/settings.js @@ -0,0 +1,3 @@ +const settings = require("../libs/settings"); + +module.exports = (method, ...args) => settings[method](...args); diff --git a/app/server/api/stores.js b/app/server/api/stores.js index 28575cfd..67a6db6b 100644 --- a/app/server/api/stores.js +++ b/app/server/api/stores.js @@ -1,8 +1,5 @@ const stores = require("../../stores"); module.exports = { - obs: (method, ...args) => stores.obs[method](...args), - app: (method, ...args) => stores.app[method](...args), panels: (method, ...args) => stores.panels[method](...args), - i18next: (method, ...args) => stores.i18next[method](...args), }; diff --git a/app/server/api/twitch.js b/app/server/api/twitch.js new file mode 100644 index 00000000..747873b2 --- /dev/null +++ b/app/server/api/twitch.js @@ -0,0 +1,67 @@ +const settings = require("../libs/settings"); +const state = require("../libs/twitch/state"); +const twitchLogin = require("../libs/twitch/login"); +const chatJoin = require("../libs/twitch/chat/join"); +const eventNames = require("../libs/twitch/events.json"); +const chatConnect = require("../libs/twitch/chat/connect"); +const addCommand = require("../libs/twitch/api/addCommand"); +const updateReward = require("../libs/twitch/api/updateReward"); +const updateCommand = require("../libs/twitch/api/updateCommand"); +const removeCommand = require("../libs/twitch/api/removeCommand"); +const getRewardList = require("../libs/twitch/api/getRewardList"); +const getCommandList = require("../libs/twitch/api/getCommandList"); +const getCommandNames = require("../libs/twitch/api/getCommandNames"); +const getLastFollowers = require("../libs/twitch/api/getLastFollowers"); + +const banner = "🤖 Marv est dans la place !"; + +module.exports = { + async login() { + const user = await twitchLogin(); + await chatConnect(); + const join = await chatJoin(user.display_name); + + if (!join.alreadyJoined) { + console.log(banner); + // twitch.chat.say(user.display_name, banner); + settings.set("twitch.currentChannel", user.display_name); + } + + return user; + }, + addCommand(command) { + return addCommand(command).then(({ dataValues }) => { + this.notify("twitch.addCommand", dataValues); + return dataValues; + }); + }, + updateCommand(command) { + return updateCommand(command).then((result) => { + this.notify("twitch.updateCommand", command); + return result; + }); + }, + removeCommand(command) { + return removeCommand(command).then((result) => { + this.notify("twitch.removeCommand", command); + return result; + }); + }, + updateReward(reward) { + return updateReward(reward).then((result) => { + this.notify("twitch.updateReward", reward); + return result; + }); + }, + getEventNames: () => eventNames, + getRewardList: () => getRewardList(), + getCommandList: () => getCommandList(), + getCommandNames: () => getCommandNames(), + getLastFollowers: () => getLastFollowers(), + getState: () => state.get(), + updateState: (state) => state.update(state), + getSettings: () => settings.getAll("twitch."), + setSetting: (key, value) => { + return settings.set(`twitch.${key}`, value); + }, +}; diff --git a/app/server/db/Models/Command.js b/app/server/db/Models/Command.js new file mode 100644 index 00000000..06e99669 --- /dev/null +++ b/app/server/db/Models/Command.js @@ -0,0 +1,32 @@ +const { DataTypes } = require("sequelize"); +const sequelize = require("../index"); + +const Command = sequelize.define("Command", { + name: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + usage: { + type: DataTypes.STRING, + allowNull: true, + }, + description: { + type: DataTypes.STRING, + allowNull: true, + }, + message: { + type: DataTypes.STRING, + allowNull: true, + }, + cooldown: { + type: DataTypes.INTEGER, + defaultValue: 60, + }, + enabled: { + type: DataTypes.BOOLEAN, + defaultValue: true, + }, +}); + +module.exports = Command; diff --git a/app/server/db/Models/Setting.js b/app/server/db/Models/Setting.js new file mode 100644 index 00000000..1e5b29ca --- /dev/null +++ b/app/server/db/Models/Setting.js @@ -0,0 +1,44 @@ +const { DataTypes } = require("sequelize"); +const sequelize = require("../index"); + +const getters = { + string: (value) => `${value}`, + integer: (value) => parseInt(value), + float: (value) => parseFloat(value), + json: (value) => (value ? JSON.parse(value) : null), + boolean: (value) => (value === "true" ? true : false), +}; + +const setters = { + string: (value) => `${value}`, + integer: (value) => `${value}`, + float: (value) => `${value}`, + json: (value) => (value ? JSON.stringify(value) : null), + boolean: (value) => (value ? "true" : "false"), +}; + +const Setting = sequelize.define("Setting", { + key: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + value: { + type: DataTypes.STRING, + allowNull: true, + get() { + const getter = getters[this.type] || getters.string; + return getter(this.getDataValue("value")); + }, + set(value) { + const setter = setters[this.type] || setters.string; + this.setDataValue("value", setter(value)); + }, + }, + type: { + type: DataTypes.STRING, + allowNull: false, + }, +}); + +module.exports = Setting; diff --git a/app/server/db/Models/Viewer.js b/app/server/db/Models/Viewer.js new file mode 100644 index 00000000..0d784ba4 --- /dev/null +++ b/app/server/db/Models/Viewer.js @@ -0,0 +1,24 @@ +const { DataTypes } = require("sequelize"); +const sequelize = require("../index"); + +const Viewer = sequelize.define("Viewer", { + id: { + type: DataTypes.STRING, + allowNull: false, + primaryKey: true, + }, + name: { + type: DataTypes.STRING, + allowNull: false, + }, + followedAt: { + type: DataTypes.DATE, + allowNull: false, + }, + isFollowing: { + type: DataTypes.BOOLEAN, + allowNull: false, + }, +}); + +module.exports = Viewer; diff --git a/app/server/db/config.js b/app/server/db/config.js new file mode 100644 index 00000000..94393727 --- /dev/null +++ b/app/server/db/config.js @@ -0,0 +1,8 @@ +const { databasePath, databaseFilename } = require("../../utils"); +const path = require("path"); + +module.exports = { + dialect: "sqlite", + storage: path.join(databasePath, databaseFilename), + logging: false, // watch ? console.log : false, +}; diff --git a/app/server/db/index.js b/app/server/db/index.js new file mode 100644 index 00000000..81d4d670 --- /dev/null +++ b/app/server/db/index.js @@ -0,0 +1,8 @@ +const { databasePath } = require("../../utils"); +const { Sequelize } = require("sequelize"); +const config = require("./config"); +const fs = require("fs-extra"); + +fs.ensureDirSync(databasePath); + +module.exports = new Sequelize(config); diff --git a/app/server/db/migrations/20201212130140-first-commit.js b/app/server/db/migrations/20201212130140-first-commit.js new file mode 100644 index 00000000..3b05cef6 --- /dev/null +++ b/app/server/db/migrations/20201212130140-first-commit.js @@ -0,0 +1,110 @@ +"use strict"; + +const { Sequelize } = require("sequelize"); + +const commandsTable = { + id: { + type: Sequelize.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + name: { + type: Sequelize.STRING, + allowNull: false, + unique: true, + }, + usage: { + type: Sequelize.STRING, + allowNull: true, + }, + description: { + type: Sequelize.STRING, + allowNull: true, + }, + cooldown: { + type: Sequelize.INTEGER, + defaultValue: 60, + }, + enabled: { + type: Sequelize.BOOLEAN, + defaultValue: true, + }, + createdAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.NOW, + }, + updatedAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.NOW, + }, +}; + +const settingsTable = { + id: { + type: Sequelize.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + key: { + type: Sequelize.STRING, + allowNull: false, + unique: true, + }, + value: { + type: Sequelize.STRING, + allowNull: false, + }, + type: { + type: Sequelize.STRING, + allowNull: false, + }, + createdAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.NOW, + }, + updatedAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.NOW, + }, +}; + +const viewersTable = { + id: { + type: Sequelize.STRING, + allowNull: false, + primaryKey: true, + }, + name: { + type: Sequelize.STRING, + allowNull: false, + }, + followedAt: { + type: Sequelize.DATE, + allowNull: false, + }, + isFollowing: { + type: Sequelize.BOOLEAN, + allowNull: false, + }, + offlineFollow: { + type: Sequelize.BOOLEAN, + defaultValue: false, + }, + createdAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.NOW, + }, + updatedAt: { + type: Sequelize.DATE, + defaultValue: Sequelize.NOW, + }, +}; + +module.exports = { + up: async ({ context }) => { + await context.createTable("Commands", commandsTable); + await context.createTable("Settings", settingsTable); + await context.createTable("Viewers", viewersTable); + }, + down: async () => {}, +}; diff --git a/app/server/db/migrations/20201231105131-remove-offline-follow.js b/app/server/db/migrations/20201231105131-remove-offline-follow.js new file mode 100644 index 00000000..189629f7 --- /dev/null +++ b/app/server/db/migrations/20201231105131-remove-offline-follow.js @@ -0,0 +1,7 @@ +"use strict"; + +module.exports = { + up: async ({ context }) => { + await context.removeColumn("Viewers", "offlineFollow"); + }, +}; diff --git a/app/server/db/migrations/20210122133319-command-add-message-field.js b/app/server/db/migrations/20210122133319-command-add-message-field.js new file mode 100644 index 00000000..78d490f2 --- /dev/null +++ b/app/server/db/migrations/20210122133319-command-add-message-field.js @@ -0,0 +1,9 @@ +"use strict"; + +const { Sequelize } = require("sequelize"); + +module.exports = { + up: async ({ context }) => { + await context.addColumn("Commands", "message", Sequelize.STRING); + }, +}; diff --git a/app/server/db/seeders/20201212134826-default-settings.js b/app/server/db/seeders/20201212134826-default-settings.js new file mode 100644 index 00000000..c6050d70 --- /dev/null +++ b/app/server/db/seeders/20201212134826-default-settings.js @@ -0,0 +1,36 @@ +const setting = require("../setting"); + +const scope = [ + "user:read:email", + "chat:read", + "chat:edit", + "channel:read:redemptions", + "channel:manage:redemptions", + "bits:read", +]; + +module.exports = { + up: async ({ context }) => { + await context.bulkInsert("Settings", [ + setting("app.language", "en", "string"), + setting("app.openOnStartup", "true", "boolean"), + setting("app.showFirstStartInfo", "true", "boolean"), + setting("app.checkUpdateAtStartup", "true", "boolean"), + + setting("server.host", "localhost", "string"), + setting("server.port", "4242", "integer"), + + setting("obs.host", "localhost", "string"), + setting("obs.port", "4444", "integer"), + setting("obs.password", "", "string"), + setting("obs.connectOnStartup", "false", "boolean"), + + setting("twitch.connectOnStartup", "false", "boolean"), + setting("twitch.currentChannel", "", "string"), + setting("twitch.accessToken", " ", "string"), + setting("twitch.scope", JSON.stringify(scope), "json"), + ]); + }, + + down: async () => {}, +}; diff --git a/app/server/db/seeders/20210101113834-settings-command-prefix.js b/app/server/db/seeders/20210101113834-settings-command-prefix.js new file mode 100644 index 00000000..a1647799 --- /dev/null +++ b/app/server/db/seeders/20210101113834-settings-command-prefix.js @@ -0,0 +1,9 @@ +const setting = require("../setting"); + +module.exports = { + up: async ({ context }) => { + await context.bulkInsert("Settings", [ + setting("command.prefix", "!", "string"), + ]); + }, +}; diff --git a/app/server/db/setting.js b/app/server/db/setting.js new file mode 100644 index 00000000..43913446 --- /dev/null +++ b/app/server/db/setting.js @@ -0,0 +1,4 @@ +module.exports = function setting(key, value, type) { + const now = new Date(); + return { key, value, type, createdAt: now, updatedAt: now }; +}; diff --git a/app/server/db/umzug.js b/app/server/db/umzug.js new file mode 100644 index 00000000..eacbc97b --- /dev/null +++ b/app/server/db/umzug.js @@ -0,0 +1,27 @@ +const { Umzug, SequelizeStorage } = require("umzug"); +const { watch } = require("../../utils"); +const sequelize = require("./index"); + +const migrations = new Umzug({ + context: sequelize.getQueryInterface(), + migrations: { glob: ["migrations/*.js", { cwd: __dirname }] }, + storage: new SequelizeStorage({ + sequelize, + modelName: "SequelizeMigrations", + }), + logger: watch ? console : undefined, +}); + +const seeders = new Umzug({ + context: sequelize.getQueryInterface(), + migrations: { glob: ["seeders/*.js", { cwd: __dirname }] }, + storage: new SequelizeStorage({ sequelize, modelName: "SequelizeSeeders" }), + logger: watch ? console : undefined, +}); + +module.exports = { + async up() { + await migrations.up(); + await seeders.up(); + }, +}; diff --git a/app/server/index.js b/app/server/index.js index bc3db480..8acdea1a 100644 --- a/app/server/index.js +++ b/app/server/index.js @@ -2,65 +2,91 @@ "use strict"; -const socket = require("./libs/socket.io"); -const { json } = require("body-parser"); -const stores = require("../stores"); -const polka = require("polka"); const sirv = require("sirv"); const http = require("http"); -const path = require("path"); - -const { i18next } = require("./libs/i18next"); +const polka = require("polka"); +const umzug = require("./db/umzug"); +const { json } = require("body-parser"); +const socket = require("./libs/socket.io"); +const settings = require("./libs/settings"); +const { getServerURL } = require("./utils"); +const { getSystemFonts } = require("./libs/files"); +const { init: i18next } = require("./libs/i18next"); +const { init: twitchInit } = require("./libs/twitch"); const missingKeyHandler = require("./libs/i18next/missingKeyHandler"); +const { uploadPath, clientPath, staticPath, fingerprint } = require("../utils"); -let { host, port, clientPath, staticPath, uploadPath } = stores.server.getAll(); -const appFingerprint = stores.app.get("fingerprint"); - -const sirvClient = sirv(clientPath, { dev: true }); -const sirvStatic = sirv(staticPath, { dev: true }); -const sirvUpload = sirv(path.dirname(uploadPath), { dev: true }); +const staticPaths = [clientPath, staticPath, uploadPath]; let portChangeCount = 0; let portChangeMaxCount = 10; -function printBanner() { - const serverURL = `http://${host}:${port}`; +async function printBanner() { // eslint-disable-next-line no-console - console.log(`> ${appFingerprint} | running on ${serverURL}`); + console.log(`> ${fingerprint} | running on ${await getServerURL()}`); } -function onError(error) { +async function onError(error) { const EADDRINUSE = error.message.includes("EADDRINUSE"); if (!EADDRINUSE || portChangeCount >= portChangeMaxCount) { throw error; } - stores.server.set("port", (port += 1)); + let port = await settings.get("server.port"); + await settings.set("server.port", (port += 1)); portChangeCount++; start(); } -function obsAutoConnect() { - if (!stores.obs.get("connectOnStartup")) return; +async function obsAutoConnect() { + if (!(await settings.get("obs.connectOnStartup"))) return; const { connect } = require("./libs/obs"); connect(); } -function start() { +async function twitchAutoConnect() { + if (!(await settings.get("twitch.connectOnStartup"))) return; + const api = require("./api/twitch"); + await api.login(); +} + +function uriDecode(req, res, next) { + req.path = decodeURI(req.path); + next(); +} + +function onStarted() { + if (typeof process.send === "function") { + process.send("started"); + } +} + +async function start() { + await umzug.up(); + await i18next(); + await twitchInit(); + + let port = await settings.get("server.port"); + const server = http.createServer(); server.on("error", onError); - polka({ server }) - .use(json()) - .use(sirvClient) - .use(sirvStatic) - .use(sirvUpload) - .post("/locales/add/:lng/:ns", missingKeyHandler(i18next)) - .listen(port, (error) => { + const p = polka({ server }).use(json()).use(uriDecode); + + const { fontPaths } = await getSystemFonts(); + [...staticPaths, ...fontPaths].forEach((path) => { + p.use(sirv(path, { dev: true })); + }); + + p.use(require("./libs/twitch/authMiddleware")()) + .post("/locales/add/:lng/:ns", missingKeyHandler) + .listen(port, async (error) => { if (error) return onError(error); - socket(server); + await socket(server); + twitchAutoConnect(); obsAutoConnect(); printBanner(); + onStarted(); }); } diff --git a/app/server/libs/actions.js b/app/server/libs/actions.js index b209fc2c..e46932d0 100644 --- a/app/server/libs/actions.js +++ b/app/server/libs/actions.js @@ -2,5 +2,6 @@ module.exports = { get: require("./actions/get"), push: require("./actions/push"), update: require("./actions/update"), + remove: require("./actions/remove"), getState: require("./actions/state").getState, }; diff --git a/app/server/libs/actions/create.js b/app/server/libs/actions/create.js index 221906c3..fe9d80a4 100644 --- a/app/server/libs/actions/create.js +++ b/app/server/libs/actions/create.js @@ -5,6 +5,7 @@ module.exports = function create(action, data = null) { id: uuid(), type: null, widget: null, + eventProps: {}, data, ...action, }; diff --git a/app/server/libs/actions/push.js b/app/server/libs/actions/push.js index 81ce19a0..847197af 100644 --- a/app/server/libs/actions/push.js +++ b/app/server/libs/actions/push.js @@ -11,11 +11,11 @@ let lock = false; function sendAction(action, immediat = false) { const { send } = actionTypes[action.type] || {}; - state.update({ ...action, running: true }); + state.update("start", { ...action, running: true }); if (!send) { state.decrement(action); - state.update({ ...action, running: false }); + state.update("end", { ...action, running: false }); return Promise.reject(`Undefined action type: ${action.type}`); } @@ -23,9 +23,9 @@ function sendAction(action, immediat = false) { .then((response) => ({ response })) .catch((error) => ({ error })) .then(({ error, response }) => { - const { inQueue } = state.decrement(action); - const running = immediat && !!inQueue; - state.update({ ...action, running }); + const newAction = state.decrement(action); + const running = immediat && !!newAction.inQueue; + state.update("end", { ...action, ...newAction, running }); return error || response; }); } diff --git a/app/server/libs/actions/remove.js b/app/server/libs/actions/remove.js new file mode 100644 index 00000000..e87cc4cf --- /dev/null +++ b/app/server/libs/actions/remove.js @@ -0,0 +1,5 @@ +const { actions } = require("../../../stores"); + +module.exports = function remove(id) { + return actions.delete(`actions.${id}`); +}; diff --git a/app/server/libs/actions/state.js b/app/server/libs/actions/state.js index f3cea655..27a1da6a 100644 --- a/app/server/libs/actions/state.js +++ b/app/server/libs/actions/state.js @@ -8,20 +8,22 @@ function push(action) { let widgetState = state[action.widget.id]; if (!widgetState) { - state[action.widget.id] = { inQueue: 1, running: false }; + state[action.widget.id] = { ...action, inQueue: 1, running: false }; } else { widgetState.inQueue++; } + io.emit("actions.push", state[action.widget.id]); io.emit("actions.state", state); return widgetState; } -function update(action) { +function update(type, action) { let widgetState = state[action.widget.id]; state[action.widget.id] = { ...widgetState, ...action }; + io.emit(`actions.${type}`, state[action.widget.id]); io.emit("actions.state", state); return widgetState; @@ -31,7 +33,7 @@ function decrement(action) { let widgetState = state[action.widget.id]; widgetState.inQueue--; state[action.widget.id] = { ...widgetState }; - return widgetState; + return state[action.widget.id]; } function getState() { diff --git a/app/server/libs/actions/types/obs.js b/app/server/libs/actions/types/obs.js index 207f1522..8533f973 100644 --- a/app/server/libs/actions/types/obs.js +++ b/app/server/libs/actions/types/obs.js @@ -5,8 +5,30 @@ function create(action) { return createAction(action); } +const actions = { + ToggleScene(action) { + const { currentScene } = obs.getState(); + const { scene1, scene2 } = action.widget.component.props; + const scene = currentScene === scene1 ? scene2 : scene1; + + return obs.send("SetCurrentScene", { "scene-name": scene }); + }, + GoToScene(action) { + const { scene } = action.widget.component.props; + return obs.send("SetCurrentScene", { "scene-name": scene }); + }, + SceneList(action) { + const { scene } = action.data || action.eventProps || "undefined"; + return obs.send("SetCurrentScene", { "scene-name": scene }); + }, + Send(action) { + return obs.send(action.data.eventName, action.data.args); + }, +}; + function send(action) { - return obs.send(action.data.eventName, action.data.args); + const func = actions[action.widget.component.name] || actions.Send; + return func(action); } module.exports = { create, send }; diff --git a/app/server/libs/files.js b/app/server/libs/files.js index a34de588..67cdc753 100644 --- a/app/server/libs/files.js +++ b/app/server/libs/files.js @@ -2,13 +2,13 @@ const path = require("path"); const mime = require("mime"); const fs = require("fs-extra"); const { _ } = require("./i18next"); -const stores = require("../../stores"); +const { filesPath } = require("../../utils"); +const getUsedFonts = require("./files/getUsedFonts"); +const getSystemFonts = require("./files/getSystemFonts"); -const language = stores.i18next.get("lng", "en"); -const uploadPath = stores.server.get("uploadPath"); -const allowedMimeTypes = ["text", "image", "audio", "video"]; +const allowedMimeTypes = ["text", "image", "audio", "video", "font"]; -fs.ensureDirSync(uploadPath); +fs.ensureDirSync(filesPath); function cleanFileName(name) { return name.replace(/[^a-z0-9_.]+/gi, "_"); @@ -19,7 +19,7 @@ function getFileInfo(filename, buffer) { const mimeType = mime.getType(filename); if (!ext || !mimeType) { - return false; + throw new Error("No extension and/or mime type"); } const type = mimeType.split("/")[0]; @@ -29,23 +29,32 @@ function getFileInfo(filename, buffer) { } function getFileInfoFromFilename(filename) { - return getFileInfo( - filename, - fs.readFileSync(path.join(uploadPath, filename)) - ); + return getFileInfo(filename, fs.readFileSync(path.join(filesPath, filename))); } function isAllowedMimeType(type) { return allowedMimeTypes.includes(type); } +async function update(filename, data) { + return new Promise((resolve, reject) => { + try { + fs.writeFileSync(path.join(filesPath, filename), data); + } catch (error) { + return reject(error); + } + + return true; + }); +} + async function upload({ name, buffer }) { return new Promise((resolve, reject) => { const filename = cleanFileName(name); const fileInfo = getFileInfo(filename, buffer); - const filePath = path.join(uploadPath, filename); + const filePath = path.join(filesPath, filename); - if (!fileInfo.size) { + if (!fileInfo.size && fileInfo.type !== "text") { return reject(_("sentences.file-is-empty")); } @@ -70,7 +79,7 @@ async function upload({ name, buffer }) { function remove(file) { return new Promise((resolve, reject) => { try { - fs.unlinkSync(path.join(uploadPath, file.filename)); + fs.unlinkSync(path.join(filesPath, file.filename)); resolve(file); } catch (error) { reject(error); @@ -79,7 +88,7 @@ function remove(file) { } function localeSort(a, b) { - return a.localeCompare(b, language, { + return a.localeCompare(b, { numeric: true, ignorePunctuation: true, }); @@ -88,7 +97,7 @@ function localeSort(a, b) { function getFileList() { return new Promise((resolve, reject) => { try { - const files = fs.readdirSync(uploadPath); + const files = fs.readdirSync(filesPath); const fileList = files .sort(localeSort) .map(getFileInfoFromFilename) @@ -104,5 +113,8 @@ function getFileList() { module.exports = { upload, remove, + update, getFileList, + getUsedFonts, + getSystemFonts, }; diff --git a/app/server/libs/files/getSystemFonts.js b/app/server/libs/files/getSystemFonts.js new file mode 100644 index 00000000..192077bc --- /dev/null +++ b/app/server/libs/files/getSystemFonts.js @@ -0,0 +1,25 @@ +const _getSystemFonts = require("get-system-fonts"); +const { filesPath } = require("../../../utils"); +const path = require("path"); + +const fontPaths = []; +const fontNames = []; + +module.exports = async function getSystemFonts() { + const paths = await _getSystemFonts({ additionalFolders: [filesPath] }); + + paths.forEach((fontPath) => { + const dirname = path.dirname(fontPath); + const basename = path.basename(fontPath); + + if (!fontNames.includes(basename)) { + fontNames.push(basename); + } + + if (!fontPaths.includes(dirname)) { + fontPaths.push(dirname); + } + }); + + return { fontPaths, fontNames }; +}; diff --git a/app/server/libs/files/getUsedFonts.js b/app/server/libs/files/getUsedFonts.js new file mode 100644 index 00000000..6758c676 --- /dev/null +++ b/app/server/libs/files/getUsedFonts.js @@ -0,0 +1,16 @@ +const stores = require("../../../stores"); + +module.exports = function getUsedFonts() { + const usedFonts = []; + + Object.values(stores.actions.get("actions", {})).forEach((action) => { + action.items.forEach((item) => { + if (item.type === "file" && item.target.type === "text") { + const family = item.target.style["font-family"]; + family && usedFonts.push(family); + } + }); + }); + + return [...new Set(usedFonts)]; +}; diff --git a/app/stores/defaults/i18next.js b/app/server/libs/i18next/config.js similarity index 62% rename from app/stores/defaults/i18next.js rename to app/server/libs/i18next/config.js index 6b2400a5..bfb43445 100644 --- a/app/stores/defaults/i18next.js +++ b/app/server/libs/i18next/config.js @@ -1,11 +1,11 @@ -const { watch } = require("../utils"); +const { watch } = require("../../../utils"); module.exports = { - ns: "app", lng: "en", + ns: "app", defaultNS: "app", fallbackLng: "en", - supportedLngs: ["en", "fr"], + supportedLngs: ["en", "fr", "es"], saveMissingTo: "all", saveMissing: watch, }; diff --git a/app/server/libs/i18next/index.js b/app/server/libs/i18next/index.js index 1b636e23..b4b2164a 100644 --- a/app/server/libs/i18next/index.js +++ b/app/server/libs/i18next/index.js @@ -1,20 +1,46 @@ +const { appPath } = require("../../../utils"); const backend = require("i18next-fs-backend"); +const settings = require("../settings"); +const config = require("./config"); const i18next = require("i18next"); const path = require("path"); -const stores = require("../../../stores"); -const options = stores.i18next.getAll(); -const locales = path.join(stores.server.get("staticPath"), "locales"); +const locales = path.join(appPath, "static/locales"); -i18next.use(backend).init({ - ...options, - initImmediate: false, - backend: { - loadPath: `${locales}/{{lng}}/{{ns}}.json`, - addPath: `${locales}/{{lng}}/{{ns}}.json`, - }, -}); +function getLocale() { + try { + return Intl.DateTimeFormat().resolvedOptions().locale.split("-")[0]; + } catch (error) { + console.log("ERROR >>>", error); + return "en"; + } +} -const _ = (...args) => i18next.t(...args); +async function getConfig() { + const isFirstStart = await settings.get("app.showFirstStartInfo", true); -module.exports = { i18next, _ }; + if (isFirstStart) { + await settings.set("app.language", getLocale()); + } + + return { ...config, lng: await settings.get("app.language") }; +} + +function _(...args) { + return i18next.t(...args); +} + +async function init() { + const settings = await getConfig(); + + i18next.use(backend).init({ + ...settings, + initImmediate: false, + backend: { + addPath: `${locales}/{{lng}}/{{ns}}.json`, + loadPath: `${locales}/{{lng}}/{{ns}}.json`, + }, + }); +} + +module.exports = { init, i18next, _, getConfig }; diff --git a/app/server/libs/i18next/missingKeyHandler.js b/app/server/libs/i18next/missingKeyHandler.js index 5c8edf2f..0178eabd 100644 --- a/app/server/libs/i18next/missingKeyHandler.js +++ b/app/server/libs/i18next/missingKeyHandler.js @@ -1,28 +1,28 @@ -module.exports = function missingKeyHandler(i18next) { - return (req, res) => { - const { lng, ns } = req.params; +const { i18next } = require("./index"); - if (!i18next.services.backendConnector) { - res.statusCode = 404; - res.end("i18next: no backend configured"); - return; - } +module.exports = (req, res) => { + const { lng, ns } = req.params; + + if (!i18next.services.backendConnector) { + res.statusCode = 404; + res.end("i18next: no backend configured"); + return; + } - for (let m in req.body) { - const v = req.body[m]; - if (i18next.options.saveMissingTo === "all") { - i18next.options.supportedLngs - .filter((language) => { - return language !== "cimode"; - }) - .forEach((lng) => { - i18next.services.backendConnector.saveMissing([lng], ns, m, v); - }); - } else { - i18next.services.backendConnector.saveMissing([lng], ns, m, v); - } + for (let m in req.body) { + const v = req.body[m]; + if (i18next.options.saveMissingTo === "all") { + i18next.options.supportedLngs + .filter((language) => { + return language !== "cimode"; + }) + .forEach((lng) => { + i18next.services.backendConnector.saveMissing([lng], ns, m, v); + }); + } else { + i18next.services.backendConnector.saveMissing([lng], ns, m, v); } + } - res.end("ok"); - }; + res.end("ok"); }; diff --git a/app/server/libs/panels.js b/app/server/libs/panels.js index b6f224c0..be594140 100644 --- a/app/server/libs/panels.js +++ b/app/server/libs/panels.js @@ -1,8 +1,14 @@ const { panels: store } = require("../../stores"); +const cloneDeep = require("clone-deep"); +const actions = require("./actions"); const { v4: uuid } = require("uuid"); const { _ } = require("./i18next"); -let panels = store.get("panels"); +let panels = getAll(); + +function getAll() { + return store.get("panels"); +} function name(id) { return `${_("sentences.powers-group")} #${id.slice(0, 4)}`; @@ -23,6 +29,9 @@ function createWidget() { id: uuid(), component: null, trigger: "immediat", + eventName: "none", + commandName: "none", + rewardId: "none", label: null, labelSize: 16, labelPadding: 8, @@ -41,6 +50,11 @@ function add() { return panel; } +function set(panels) { + store.set("panels", panels); + return panels; +} + function update(panel) { panels = panels.map((p) => { if (p.id === panel.id) { @@ -57,6 +71,9 @@ function remove(panel) { panels = panels.filter((p, i) => { if (p.id === panel.id) { pos = i; + panel.widgets.forEach((widget) => { + actions.remove(widget.id); + }); return false; } return true; @@ -69,6 +86,10 @@ function findPanelById(id) { return panels.find((p) => p.id === id); } +function findWidgetById(panel, id) { + return panel.widgets.find((w) => w.id === id); +} + function addWidget(panel, item) { let widget = createWidget(); const oldPanel = findPanelById(panel.id); @@ -77,7 +98,59 @@ function addWidget(panel, item) { return { panel: update(oldPanel), widget, item }; } +function duplicateWidget({ panel, widgetId, position }) { + const oldPanel = findPanelById(panel.id); + const oldWidget = findWidgetById(panel, widgetId); + const widget = { ...cloneDeep(oldWidget), id: uuid() }; + const action = actions.get(oldWidget.id); + if (action) { + actions.update({ widget, anime: { ...cloneDeep(action), id: uuid() } }); + } + oldPanel.grid.push({ id: widget.id, ...position }); + oldPanel.widgets.push(widget); + return { panel: update(oldPanel), widget, item: position }; +} + +function moveWidgetToPanel({ panel, targetPanel: tp, widgetId, position }) { + let widget = null; + + let targetPanel = findPanelById(tp.id); + let sourcePanel = findPanelById(panel.id); + + sourcePanel.grid = sourcePanel.grid.filter((w) => w.id !== widgetId); + sourcePanel.widgets = sourcePanel.widgets.filter((w) => { + if (w.id === widgetId) { + widget = w; + return false; + } + return true; + }); + + targetPanel.grid.push({ id: widget.id, ...position }); + targetPanel.widgets.push(widget); + + const action = actions.get(widgetId); + + if (action) { + actions.remove(widgetId); + actions.update({ widget, anime: { ...cloneDeep(action), id: uuid() } }); + } + + return [ + { panel: update(sourcePanel), widget }, + { panel: update(targetPanel), widget }, + ]; +} + +function removeWidgetComponent(panel, widget) { + if (!widget.component) return; + actions.remove(widget.id); + widget.component = null; + return { panel: update(panel), widget }; +} + function removeWidget(panel, widget) { + removeWidgetComponent(panel, widget); const oldPanel = findPanelById(panel.id); oldPanel.grid = oldPanel.grid.filter((w) => w.id !== widget.id); oldPanel.widgets = oldPanel.widgets.filter((w) => w.id !== widget.id); @@ -86,8 +159,13 @@ function removeWidget(panel, widget) { module.exports = { add, + set, remove, update, + getAll, addWidget, removeWidget, + duplicateWidget, + moveWidgetToPanel, + removeWidgetComponent, }; diff --git a/app/server/libs/settings.js b/app/server/libs/settings.js new file mode 100644 index 00000000..3ccd7449 --- /dev/null +++ b/app/server/libs/settings.js @@ -0,0 +1,33 @@ +const Setting = require("../db/Models/Setting"); +const { Op } = require("sequelize"); + +async function get(key, defaultValue = null) { + const result = await Setting.findOne({ where: { key } }); + return result ? result.value : defaultValue; +} + +async function set(key, value, type) { + const setting = await Setting.findOne({ where: { key } }); + + if (!setting) { + return Setting.create({ key, value, type: type || "string" }); + } else { + setting.value = value; + return setting.save(); + } +} + +async function getAll(key = null) { + const settings = {}; + const attributes = ["key", "value", "type"]; + const where = key ? { key: { [Op.startsWith]: key } } : undefined; + const results = await Setting.findAll({ attributes, where }); + + results.forEach((setting) => { + settings[key ? setting.key.slice(key.length) : setting.key] = setting.value; + }); + + return settings; +} + +module.exports = { get, set, getAll }; diff --git a/app/server/libs/socket.io/index.js b/app/server/libs/socket.io/index.js index cea98ca2..47f73655 100644 --- a/app/server/libs/socket.io/index.js +++ b/app/server/libs/socket.io/index.js @@ -14,6 +14,10 @@ module.exports = (server) => { io = socket(server, options); + io.origins((origin, callback) => { + callback(null, true); + }); + io.on("connection", (clientSocket) => { clientSocket.use(require("./api")(clientSocket)); clientSocket.use(require("./unhandledEvent")); @@ -24,8 +28,10 @@ module.exports = (server) => { adminNamespace.on("connection", (overlaySocket) => { io.__overlaySocket = overlaySocket; + io.emit("overlay.connected"); overlaySocket.on("disconnect", () => { io.__overlaySocket = null; + io.emit("overlay.disconnected"); }); }); diff --git a/app/server/libs/twitch/AuthProvider.js b/app/server/libs/twitch/AuthProvider.js new file mode 100644 index 00000000..f19a7bdf --- /dev/null +++ b/app/server/libs/twitch/AuthProvider.js @@ -0,0 +1,99 @@ +const open = require("open"); +const settings = require("../settings"); +const { AccessToken } = require("twitch"); + +const authBaseURL = "https://id.twitch.tv/oauth2/authorize?response_type=token"; + +function normalizeScopes(scopes) { + if (typeof scopes === "string") { + scopes = [scopes]; + } else if (!scopes) { + scopes = []; + } + return scopes; +} + +module.exports = class AuthProvider { + constructor({ + clientId, + scope = [], + accessToken = null, + redirectURI = "http://localhost", + forceVerify = false, + } = {}) { + this.clientId = clientId; + this.redirectURI = redirectURI; + this.forceVerify = forceVerify; + + this.tokenType = "user"; + this.accessToken = null; + this.currentScopes = scope; + + if (accessToken) { + this.accessToken = new AccessToken({ access_token: accessToken, scope }); + } + + this.__resolveToken = null; + this.__rejectToken = null; + } + + hasScopes(scopes) { + return scopes.every((scope) => this.currentScopes.includes(scope)); + } + + getAuthUrl(scopes) { + const redir = encodeURIComponent(this.redirectURI); + + return ( + `${authBaseURL}&client_id=${this.clientId}` + + `&redirect_uri=${redir}&scope=${scopes.join(" ")}` + + `&force_verify=${this.forceVerify ? "true" : "false"}` + ); + } + + setAccessToken(accessToken) { + this.accessToken = accessToken; + } + + resolveToken(response) { + this.__resolveToken && this.__resolveToken(response); + this.__resolveToken = null; + } + + rejectToken(error) { + this.__rejectToken && this.__rejectToken(error); + this.__rejectToken = null; + } + + async refresh() { + await settings.set("twitch.accessToken", " "); + return this.getAccessToken(this.currentScopes, { refresh: true }); + } + + getAccessToken(scopes = null, { refresh = false } = {}) { + return new Promise((resolve, reject) => { + scopes = normalizeScopes(scopes); + + // eslint-disable-next-line no-console + // console.log("\x1b[35m%s\x1b[0m", `Twitch request scopes [${scopes}]`); + + const forceVerify = refresh || this.forceVerify; + + if (!forceVerify && this.accessToken && this.hasScopes(scopes)) { + return resolve(this.accessToken); + } + + this.__rejectToken = reject; + this.__resolveToken = async ({ access_token }) => { + this.currentScopes = [...new Set([...this.currentScopes, ...scopes])]; + const accessToken = { access_token, scope: this.currentScopes }; + this.accessToken = new AccessToken(accessToken); + await settings.set("twitch.scope", this.currentScopes); + await settings.set("twitch.accessToken", access_token); + resolve(this.accessToken); + }; + + open(this.getAuthUrl(scopes)); + }); + } +}; diff --git a/app/server/libs/twitch/api/addCommand.js b/app/server/libs/twitch/api/addCommand.js new file mode 100644 index 00000000..04ca87b2 --- /dev/null +++ b/app/server/libs/twitch/api/addCommand.js @@ -0,0 +1,5 @@ +const Command = require("../../../db/Models/Command"); + +module.exports = function addCommand(command) { + return Command.create(command); +}; diff --git a/app/server/libs/twitch/api/getCommandByName.js b/app/server/libs/twitch/api/getCommandByName.js new file mode 100644 index 00000000..07ee0b15 --- /dev/null +++ b/app/server/libs/twitch/api/getCommandByName.js @@ -0,0 +1,5 @@ +const Command = require("../../../db/Models/Command"); + +module.exports = async function getCommandByName(name) { + return await Command.findOne({ where: { name }, order: [["name", "ASC"]] }); +}; diff --git a/app/server/libs/twitch/api/getCommandList.js b/app/server/libs/twitch/api/getCommandList.js new file mode 100644 index 00000000..3b784f34 --- /dev/null +++ b/app/server/libs/twitch/api/getCommandList.js @@ -0,0 +1,5 @@ +const Command = require("../../../db/Models/Command"); + +module.exports = async function getCommandList() { + return await Command.findAll({ order: [["name", "ASC"]] }); +}; diff --git a/app/server/libs/twitch/api/getCommandNames.js b/app/server/libs/twitch/api/getCommandNames.js new file mode 100644 index 00000000..476fb153 --- /dev/null +++ b/app/server/libs/twitch/api/getCommandNames.js @@ -0,0 +1,5 @@ +const getCommandList = require("./getCommandList"); + +module.exports = async function getCommandNames() { + return (await getCommandList()).map((command) => command.name); +}; diff --git a/app/server/libs/twitch/api/getConnectedUser.js b/app/server/libs/twitch/api/getConnectedUser.js new file mode 100644 index 00000000..7936211c --- /dev/null +++ b/app/server/libs/twitch/api/getConnectedUser.js @@ -0,0 +1,6 @@ +const twitch = require("../index"); + +module.exports = async function getConnectedUser() { + const user = await twitch.api.helix.users.getMe(true); + return user ? user._data : null; +}; diff --git a/app/server/libs/twitch/api/getFollows.js b/app/server/libs/twitch/api/getFollows.js new file mode 100644 index 00000000..b8b15e06 --- /dev/null +++ b/app/server/libs/twitch/api/getFollows.js @@ -0,0 +1,46 @@ +const login = require("../login"); +const twitch = require("../index"); +const Viewer = require("../../../db/Models/Viewer"); + +module.exports = async function getFollows({ delay = 2 } = {}) { + const user = await login(); + const followsPaginated = await twitch.api.helix.users.getFollowsPaginated({ + followedUser: user, + }); + + const oldFollows = []; + const newFollows = []; + + return new Promise((resolve) => { + const getNext = async () => { + let follows = await followsPaginated.getNext(); + + if (!follows.length) { + return resolve({ oldFollows, newFollows }); + } + + for (let i = 0, l = follows.length; i < l; i++) { + const { _data } = follows[i]; + + const oldFollow = await Viewer.findByPk(_data.from_id); + + if (oldFollow) { + oldFollows.push(oldFollow); + } else { + const newFollow = await Viewer.create({ + id: _data.from_id, + name: _data.from_name, + followedAt: _data.followed_at, + isFollowing: true, + }); + + newFollows.push(newFollow); + } + } + + setTimeout(getNext, delay * 1000); + }; + + getNext(); + }); +}; diff --git a/app/server/libs/twitch/api/getLastFollowers.js b/app/server/libs/twitch/api/getLastFollowers.js new file mode 100644 index 00000000..562cbc4c --- /dev/null +++ b/app/server/libs/twitch/api/getLastFollowers.js @@ -0,0 +1,9 @@ +const Viewer = require("../../../db/Models/Viewer"); + +module.exports = async function getLastFollowers({ limit = 42 } = {}) { + return Viewer.findAll({ + where: { isFollowing: 1 }, + order: [["followedAt", "DESC"]], + limit, + }); +}; diff --git a/app/server/libs/twitch/api/getLastFollows.js b/app/server/libs/twitch/api/getLastFollows.js new file mode 100644 index 00000000..49f66ed3 --- /dev/null +++ b/app/server/libs/twitch/api/getLastFollows.js @@ -0,0 +1,33 @@ +const login = require("../login"); +const twitch = require("../index"); +const Viewer = require("../../../db/Models/Viewer"); + +module.exports = async function getLastFollows() { + const user = await login(); + const followsPaginated = await twitch.api.helix.users.getFollowsPaginated({ + followedUser: user, + }); + + const newFollows = []; + + let follows = await followsPaginated.getNext(); + + for (let i = 0, l = follows.length; i < l; i++) { + const { _data } = follows[i]; + + const oldFollow = await Viewer.findByPk(_data.from_id); + + if (oldFollow) break; + + const newFollow = await Viewer.create({ + id: _data.from_id, + name: _data.from_name, + followedAt: _data.followed_at, + isFollowing: true, + }); + + newFollows.push(newFollow); + } + + return newFollows; +}; diff --git a/app/server/libs/twitch/api/getRewardList.js b/app/server/libs/twitch/api/getRewardList.js new file mode 100644 index 00000000..fecd799b --- /dev/null +++ b/app/server/libs/twitch/api/getRewardList.js @@ -0,0 +1,12 @@ +const twitch = require("../index"); +const login = require("../login"); + +function mapSort(rewards) { + return rewards.map((reward) => reward._data).sort((a, b) => a.cost - b.cost); +} + +module.exports = async function getRewardList() { + const user = await login(); + const rewards = await twitch.api.helix.channelPoints.getCustomRewards(user); + return rewards ? mapSort(rewards) : null; +}; diff --git a/app/server/libs/twitch/api/getStreamByChannel.js b/app/server/libs/twitch/api/getStreamByChannel.js new file mode 100644 index 00000000..b72a2ae6 --- /dev/null +++ b/app/server/libs/twitch/api/getStreamByChannel.js @@ -0,0 +1,8 @@ +const twitch = require("../index"); + +module.exports = async function getStreamByChannel(channel) { + channel = channel[0] === "#" ? channel.slice(1) : channel; + const user = await twitch.api.helix.users.getUserByName(channel); + const stream = await twitch.api.helix.streams.getStreamByUserId(user); + return stream ? stream._data : null; +}; diff --git a/app/server/libs/twitch/api/removeCommand.js b/app/server/libs/twitch/api/removeCommand.js new file mode 100644 index 00000000..a56c6e63 --- /dev/null +++ b/app/server/libs/twitch/api/removeCommand.js @@ -0,0 +1,5 @@ +const Command = require("../../../db/Models/Command"); + +module.exports = async function removeCommand(command) { + return await Command.destroy({ where: { id: command.id } }); +}; diff --git a/app/server/libs/twitch/api/updateCommand.js b/app/server/libs/twitch/api/updateCommand.js new file mode 100644 index 00000000..0e7d74cc --- /dev/null +++ b/app/server/libs/twitch/api/updateCommand.js @@ -0,0 +1,5 @@ +const Command = require("../../../db/Models/Command"); + +module.exports = function updateCommand(command) { + return Command.update(command, { where: { id: command.id } }); +}; diff --git a/app/server/libs/twitch/api/updateReward.js b/app/server/libs/twitch/api/updateReward.js new file mode 100644 index 00000000..fa6bb10f --- /dev/null +++ b/app/server/libs/twitch/api/updateReward.js @@ -0,0 +1,12 @@ +const twitch = require("../index"); +const login = require("../login"); + +module.exports = async function updateReward({ id, isPaused }) { + const user = await login(); + const reward = await twitch.api.helix.channelPoints.updateCustomReward( + user, + id, + { isPaused } + ); + return reward ? reward._data : null; +}; diff --git a/app/server/libs/twitch/authMiddleware.js b/app/server/libs/twitch/authMiddleware.js new file mode 100644 index 00000000..156b9460 --- /dev/null +++ b/app/server/libs/twitch/authMiddleware.js @@ -0,0 +1,39 @@ +const twitch = require("./index"); + +function twitchAuth(req, res) { + if (req.query.error) { + this.rejectToken(req.query); + + return res.end(` +

Error! ${req.query.error_description}...

+ + `); + } + + res.end(` + + `); +} + +function twitchAuthSet(req, res) { + res.end(` +

Logged-In! You can close this window :)

+ + `); + + this.resolveToken(req.query); +} + +function authMiddleware(req, res, next) { + if (req.path === "/twitch-auth") { + twitchAuth.call(this, req, res); + } else if (req.path === "/twitch-auth/set") { + twitchAuthSet.call(this, req, res, next); + } + + next(); +} + +module.exports = () => authMiddleware.bind(twitch.authProvider); diff --git a/app/server/libs/twitch/chat/connect.js b/app/server/libs/twitch/chat/connect.js new file mode 100644 index 00000000..d4e31797 --- /dev/null +++ b/app/server/libs/twitch/chat/connect.js @@ -0,0 +1,53 @@ +const state = require("../state"); +const { chat } = require("../index"); + +let connectId = null; +const reconnectDelay = 5; // seconds + +function delayConnect() { + connectId && clearTimeout(connectId); + connectId = setTimeout(reconnect, reconnectDelay * 1000); +} + +function reconnect() { + state.set("chat.connected", false); + connect().catch(() => { + delayConnect(); + }); +} + +chat.onDisconnect((manually) => { + state.set("chat.connected", false); + if (!manually) delayConnect(); +}); + +function connect() { + if (state.get("chat.connected")) { + return Promise.resolve({ alreadyConnected: true }); + } + + if (state.get("chat.connecting")) { + throw new Error("Twitch chat already connecting..."); + } + + state.set("chat.connecting", true); + + return chat + .connect() + .then(() => { + state.set("chat.connected", true); + state.set("chat.connecting", false); + return new Promise((resolve) => { + chat.onRegister(() => { + state.set("chat.registered", true); + resolve(); + }); + }); + }) + .catch((error) => { + state.set("chat.connected", false); + return Promise.reject(error); + }); +} + +module.exports = connect; diff --git a/app/server/libs/twitch/chat/events/index.js b/app/server/libs/twitch/chat/events/index.js new file mode 100644 index 00000000..e80dc3ff --- /dev/null +++ b/app/server/libs/twitch/chat/events/index.js @@ -0,0 +1,9 @@ +const twitch = require("../../index"); +const path = require("path"); +const fs = require("fs"); + +fs.readdirSync(__dirname).forEach((filename) => { + const name = path.parse(filename).name; + if (name === "index") return; + twitch.chat[name](require(`./${name}`).bind(twitch.chat)); +}); diff --git a/app/server/libs/twitch/chat/events/onAction.js b/app/server/libs/twitch/chat/events/onAction.js new file mode 100644 index 00000000..40102d20 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onAction.js @@ -0,0 +1,6 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onAction(channel, user, message) { + const date = new Intl.DateTimeFormat("fr-FR").format(Date.now()); + pushActions("onAction", { user, message, date }); +}; diff --git a/app/server/libs/twitch/chat/events/onBan.js b/app/server/libs/twitch/chat/events/onBan.js new file mode 100644 index 00000000..97d5064f --- /dev/null +++ b/app/server/libs/twitch/chat/events/onBan.js @@ -0,0 +1,5 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onBan(channel, user) { + pushActions("onBan", { user }); +}; diff --git a/app/server/libs/twitch/chat/events/onBitsBadgeUpgrade.js b/app/server/libs/twitch/chat/events/onBitsBadgeUpgrade.js new file mode 100644 index 00000000..dc808107 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onBitsBadgeUpgrade.js @@ -0,0 +1,6 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onBitsBadgeUpgrade(channel, user, upgradeInfo) { + const { displayName, threshold } = upgradeInfo; + pushActions("onBitsBadgeUpgrade", { user: displayName, threshold }); +}; diff --git a/app/server/libs/twitch/chat/events/onCommunityPayForward.js b/app/server/libs/twitch/chat/events/onCommunityPayForward.js new file mode 100644 index 00000000..6b00bcef --- /dev/null +++ b/app/server/libs/twitch/chat/events/onCommunityPayForward.js @@ -0,0 +1,9 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onCommunityPayForward(channel, user, forwardInfo) { + const { displayName, originalGifterDisplayName } = forwardInfo; + pushActions("onCommunityPayForward", { + fromUser: originalGifterDisplayName, + toUser: displayName, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onCommunitySub.js b/app/server/libs/twitch/chat/events/onCommunitySub.js new file mode 100644 index 00000000..98b3dadf --- /dev/null +++ b/app/server/libs/twitch/chat/events/onCommunitySub.js @@ -0,0 +1,11 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onCommunitySub(channel, user, subInfo) { + const { count, gifter, gifterGiftCount, plan } = subInfo; + pushActions("onCommunitySub", { + user: gifter, + count, + total: gifterGiftCount, + tiers: plan, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onGiftPaidUpgrade.js b/app/server/libs/twitch/chat/events/onGiftPaidUpgrade.js new file mode 100644 index 00000000..80c23769 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onGiftPaidUpgrade.js @@ -0,0 +1,10 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onGiftPaidUpgrade(channel, user, subInfo) { + const { gifter, displayName, plan } = subInfo; + pushActions("onGiftPaidUpgrade", { + fromUser: gifter, + toUser: displayName, + tiers: plan, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onHosted.js b/app/server/libs/twitch/chat/events/onHosted.js new file mode 100644 index 00000000..11dd0bd6 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onHosted.js @@ -0,0 +1,8 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onHosted(channel, byChannel, auto, viewers) { + pushActions("onHosted", { + channel: byChannel, + viewerCount: viewers || "???", + }); +}; diff --git a/app/server/libs/twitch/chat/events/onJoin.js b/app/server/libs/twitch/chat/events/onJoin.js new file mode 100644 index 00000000..d2d26b1c --- /dev/null +++ b/app/server/libs/twitch/chat/events/onJoin.js @@ -0,0 +1,5 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onJoin(channel, user) { + pushActions("onJoin", { user }); +}; diff --git a/app/server/libs/twitch/chat/events/onMessage.js b/app/server/libs/twitch/chat/events/onMessage.js new file mode 100644 index 00000000..cc8f9379 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onMessage.js @@ -0,0 +1,29 @@ +const pushActions = require("../../pushActions"); +const settings = require("../../../settings"); +const onCommand = require("../onCommand"); + +function isCommand(prefix, message) { + return message.startsWith(prefix); +} + +function parseCommand(prefix, message) { + const args = message.slice(prefix.length).split(" "); + const name = args.shift(); + + return { prefix, name, args }; +} + +module.exports = async function onMessage(channel, nick, message, data) { + pushActions("onMessage", { user: nick, message }); + + const prefix = await settings.get("command.prefix"); + if (!isCommand(prefix, message)) return; + const command = parseCommand(prefix, message); + + try { + const _onCommand = onCommand.bind(this); + await _onCommand({ command, channel, nick, message, data }); + } catch (error) { + this.say(channel, error.message); + } +}; diff --git a/app/server/libs/twitch/chat/events/onPart.js b/app/server/libs/twitch/chat/events/onPart.js new file mode 100644 index 00000000..434948d8 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onPart.js @@ -0,0 +1,5 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onPart(channel, user) { + pushActions("onPart", { user }); +}; diff --git a/app/server/libs/twitch/chat/events/onPrimeCommunityGift.js b/app/server/libs/twitch/chat/events/onPrimeCommunityGift.js new file mode 100644 index 00000000..558c057e --- /dev/null +++ b/app/server/libs/twitch/chat/events/onPrimeCommunityGift.js @@ -0,0 +1,6 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onPrimeCommunityGift(channel, user, subInfo) { + const { gifter } = subInfo; + pushActions("onPrimeCommunityGift", { user: gifter, name }); +}; diff --git a/app/server/libs/twitch/chat/events/onPrimePaidUpgrade.js b/app/server/libs/twitch/chat/events/onPrimePaidUpgrade.js new file mode 100644 index 00000000..eb744198 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onPrimePaidUpgrade.js @@ -0,0 +1,6 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onPrimePaidUpgrade(channel, user, subInfo) { + const { displayName, plan } = subInfo; + pushActions("onPrimePaidUpgrade", { user: displayName, tiers: plan }); +}; diff --git a/app/server/libs/twitch/chat/events/onRaid.js b/app/server/libs/twitch/chat/events/onRaid.js new file mode 100644 index 00000000..85338637 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onRaid.js @@ -0,0 +1,6 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onRaid(channel, user, raidInfo) { + const { displayName, viewerCount } = raidInfo; + pushActions("onRaid", { channel: displayName, viewerCount }); +}; diff --git a/app/server/libs/twitch/chat/events/onResub.js b/app/server/libs/twitch/chat/events/onResub.js new file mode 100644 index 00000000..0f1a1605 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onResub.js @@ -0,0 +1,23 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onResub(channel, user, subInfo) { + const { + displayName, + plan, + planName, + streak, + isPrime, + months, + message, + } = subInfo; + + pushActions("onResub", { + user: displayName, + plan: planName, + streak, + isPrime, + months, + message, + tiers: plan, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onRewardGift.js b/app/server/libs/twitch/chat/events/onRewardGift.js new file mode 100644 index 00000000..80ec60f7 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onRewardGift.js @@ -0,0 +1,19 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onRewardGift(channel, user, rewardGiftInfo) { + const { + count, + domain, + gifterDisplayName, + gifterGiftCount, + triggerType, + } = rewardGiftInfo; + + pushActions("onRewardGift", { + count, + domain, + type: triggerType, + user: gifterDisplayName, + total: gifterGiftCount, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onRitual.js b/app/server/libs/twitch/chat/events/onRitual.js new file mode 100644 index 00000000..a1f6c26d --- /dev/null +++ b/app/server/libs/twitch/chat/events/onRitual.js @@ -0,0 +1,6 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onRitual(channel, user, ritualInfo) { + const { ritualName, message } = ritualInfo; + pushActions("onRitual", { ritualName, message }); +}; diff --git a/app/server/libs/twitch/chat/events/onStandardPayForward.js b/app/server/libs/twitch/chat/events/onStandardPayForward.js new file mode 100644 index 00000000..08b78c98 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onStandardPayForward.js @@ -0,0 +1,15 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onStandardPayForward(channel, user, forwardInfo) { + const { + displayName, + recipientDisplayName, + originalGifterDisplayName, + } = forwardInfo; + + pushActions("onStandardPayForward", { + user: displayName, + fromUser: originalGifterDisplayName, + toUser: recipientDisplayName, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onSub.js b/app/server/libs/twitch/chat/events/onSub.js new file mode 100644 index 00000000..741b8e57 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onSub.js @@ -0,0 +1,23 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onSub(channel, user, subInfo) { + const { + displayName, + isPrime, + message, + months, + plan, + planName, + streak, + } = subInfo; + + pushActions("onSub", { + user: displayName, + plan: planName, + streak, + isPrime, + months, + message, + tiers: plan, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onSubExtend.js b/app/server/libs/twitch/chat/events/onSubExtend.js new file mode 100644 index 00000000..f61889ae --- /dev/null +++ b/app/server/libs/twitch/chat/events/onSubExtend.js @@ -0,0 +1,11 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onSubExtend(channel, user, subInfo) { + const { displayName, endMonth, months, plan } = subInfo; + pushActions("onSubExtend", { + user: displayName, + months, + endMonth, + tiers: plan, + }); +}; diff --git a/app/server/libs/twitch/chat/events/onSubGift.js b/app/server/libs/twitch/chat/events/onSubGift.js new file mode 100644 index 00000000..a5f057f1 --- /dev/null +++ b/app/server/libs/twitch/chat/events/onSubGift.js @@ -0,0 +1,29 @@ +const pushActions = require("../../pushActions"); + +module.exports = function onSubGift(channel, user, subInfo) { + const { + toUser: displayName, + fromUser: gifter, + total: gifterGiftCount, + duration: giftDuration, + isPrime, + message, + months, + plan, + planName, + streak, + } = subInfo; + + pushActions("onSubGift", { + toUser: displayName, + fromUser: gifter, + total: gifterGiftCount, + duration: giftDuration, + isPrime, + message, + months, + plan, + planName, + streak, + }); +}; diff --git a/app/server/libs/twitch/chat/join.js b/app/server/libs/twitch/chat/join.js new file mode 100644 index 00000000..bba218fa --- /dev/null +++ b/app/server/libs/twitch/chat/join.js @@ -0,0 +1,22 @@ +const state = require("../state"); +const { chat } = require("../index"); + +module.exports = function join(channel) { + const joinedChannels = state.get("chat.joinedChannels"); + + if (joinedChannels.includes(channel)) { + return Promise.resolve({ alreadyJoined: true }); + } + + joinedChannels.push(channel); + + return chat + .join(channel) + .then(() => { + return Promise.resolve({ alreadyJoined: false }); + }) + .catch((error) => { + state.set("chat.joinedChannels", [...new Set(joinedChannels)]); + return Promise.reject(error); + }); +}; diff --git a/app/server/libs/twitch/chat/onCommand.js b/app/server/libs/twitch/chat/onCommand.js new file mode 100644 index 00000000..60cda0b4 --- /dev/null +++ b/app/server/libs/twitch/chat/onCommand.js @@ -0,0 +1,69 @@ +const getCommandByName = require("../api/getCommandByName"); +const pushActions = require("../pushActions"); +const { _ } = require("../../i18next"); +const ejs = require("ejs"); +const ms = require("ms"); + +const cooldowns = {}; + +function parseUsage(usage) { + return (usage || "") + .replace(/[ ,]+/g, " ") + .trim() + .split(" ") + .filter((arg) => arg.length); +} + +module.exports = async function onCommand({ channel, command, nick, message }) { + const commandEntry = await getCommandByName(command.name); + + if (!commandEntry || !commandEntry.enabled) { + return; + } + + const now = Date.now(); + const lastCall = cooldowns[command.name] || 0; + const cooldown = commandEntry.cooldown * 1000; + const elapsedTime = now - lastCall; + + if (elapsedTime < cooldown) { + const rest = ms(cooldown - elapsedTime); + this.say( + channel, + _("twitch.command-cooldown", { command: command.name, rest }) + ); + return; + } + + const args = {}; + const argNames = parseUsage(commandEntry.usage); + const argList = argNames.map((arg) => `[${arg}]`).join(" "); + const usage = `${command.prefix}${command.name} ${argList}`; + + if (command.args.length < argNames.length) { + throw new Error(`${_("twitch.command-not-enough-argument", { usage })}`); + } + + if (command.args.length > argNames.length) { + const i = argNames.length - 1; + const rest = command.args.splice(i, command.args.length - i); + command.args.push(rest.join(" ")); + } + + argNames.forEach((arg, i) => { + const value = command.args[i] || `$${arg}`; + const float = parseFloat(value); + args[arg] = isNaN(value) ? value : float; + }); + + args.user = nick; + + cooldowns[command.name] = now; + pushActions("onCommand", { user: nick, message, command, ...args }); + + let chatMessage = (commandEntry.message || "").trim(); + + if (chatMessage.length) { + this.say(channel, ejs.render(chatMessage, args)); + } +}; diff --git a/app/server/libs/twitch/config.js b/app/server/libs/twitch/config.js new file mode 100644 index 00000000..afbc5e44 --- /dev/null +++ b/app/server/libs/twitch/config.js @@ -0,0 +1,5 @@ +module.exports = { + clientId: "d9szwgmmltndfb8mcg1t6mok5ghltn", + redirectPath: `twitch-auth`, + forceVerify: false, +}; diff --git a/app/server/libs/twitch/events.json b/app/server/libs/twitch/events.json new file mode 100644 index 00000000..66e2412f --- /dev/null +++ b/app/server/libs/twitch/events.json @@ -0,0 +1,49 @@ +[ + { "name": "onAction", "tags": ["user", "message", "date"] }, + { "name": "onBan", "tags": ["user"] }, + { "name": "onBits", "tags": ["user", "message", "amount", "total"] }, + { "name": "onBitsBadgeUpgrade", "tags": ["user", "threshold"] }, + { "name": "onCommand", "tags": [] }, + { "name": "onCommunityPayForward", "tags": ["fromUser", "toUser"] }, + { "name": "onCommunitySub", "tags": ["user", "count", "total", "tiers"] }, + { "name": "onFollow", "tags": ["user"] }, + { "name": "onGiftPaidUpgrade", "tags": ["fromUser", "toUser", "tiers"] }, + { "name": "onHosted", "tags": ["channel", "viewerCount"] }, + { "name": "onJoin", "tags": ["user"] }, + { "name": "onMessage", "tags": ["user", "message"] }, + { "name": "onPart", "tags": ["user"] }, + { "name": "onPrimeCommunityGift", "tags": ["user", "name"] }, + { "name": "onPrimePaidUpgrade", "tags": ["user", "tiers"] }, + { "name": "onRaid", "tags": ["channel", "viewerCount"] }, + { "name": "onRedemption", "tags": ["id", "user", "reward", "message"] }, + { + "name": "onResub", + "tags": ["user", "plan", "streak", "isPrime", "months", "message", "tiers"] + }, + { + "name": "onRewardGift", + "tags": ["count", "domain", "type", "user", "total"] + }, + { "name": "onRitual", "tags": ["ritualName", "message"] }, + { "name": "onStandardPayForward", "tags": ["user", "fromUser", "toUser"] }, + { + "name": "onSub", + "tags": ["user", "plan", "streak", "isPrime", "months", "message", "tiers"] + }, + { "name": "onSubExtend", "tags": ["user", "months", "endMonth", "tiers"] }, + { + "name": "onSubGift", + "tags": [ + "toUser", + "fromUser", + "total", + "duration", + "isPrime", + "message", + "months", + "plan", + "planName", + "streak" + ] + } +] diff --git a/app/server/libs/twitch/index.js b/app/server/libs/twitch/index.js new file mode 100644 index 00000000..3276dc1c --- /dev/null +++ b/app/server/libs/twitch/index.js @@ -0,0 +1,34 @@ +const config = require("./config"); +const settings = require("../settings"); +const { ApiClient } = require("twitch"); +const AuthProvider = require("./AuthProvider"); +const { ChatClient } = require("twitch-chat-client"); + +require("./logger-hook"); + +const api = { + config, + authProvider: null, + chat: null, + api: null, +}; + +api.init = async function init() { + const host = await settings.get("server.host"); + const port = await settings.get("server.port"); + const scope = await settings.get("twitch.scope", []); + const accessToken = await settings.get("twitch.accessToken", null); + const redirectURI = `http://${host}:${port}/${config.redirectPath}`; + api.authProvider = new AuthProvider({ + ...config, + redirectURI, + accessToken, + scope, + }); + api.api = new ApiClient({ authProvider: api.authProvider }); + api.chat = new ChatClient(api.authProvider, { + requestMembershipEvents: true, + }); +}; + +module.exports = api; diff --git a/app/server/libs/twitch/initEvents.js b/app/server/libs/twitch/initEvents.js new file mode 100644 index 00000000..e97e118b --- /dev/null +++ b/app/server/libs/twitch/initEvents.js @@ -0,0 +1,5 @@ +module.exports = async function initEvents() { + require("./chat/events"); + await require("./pubsub")(); + require("./plugins/install")(); +}; diff --git a/app/server/libs/twitch/logger-hook.js b/app/server/libs/twitch/logger-hook.js new file mode 100644 index 00000000..efb9f54d --- /dev/null +++ b/app/server/libs/twitch/logger-hook.js @@ -0,0 +1,61 @@ +const { LogLevel, Logger } = require("@d-fischer/logger"); +const { watch, logsPath } = require("../../../utils"); +const chalk = require("chalk"); +const fs = require("fs-extra"); +const path = require("path"); + +let locked = false; +let queue = []; + +const maxLines = 500; +const logFile = path.join(logsPath, "twitch.log"); +const minLogLevel = watch ? LogLevel.DEBUG : LogLevel.WARNING; +const colors = [chalk.red, chalk.red, chalk.orange, chalk.blue, chalk.white]; + +fs.ensureFileSync(logFile); + +function getLogs() { + const text = fs.readFileSync(logFile); + return text.toString().split("\n"); +} + +function writeLogs(logs) { + if (locked) { + queue.unshift(logs); + return; + } + + locked = true; + + fs.writeFileSync(logFile, logs.slice(0, maxLines).join("\n")); + + if (queue.length) { + fs.writeFileSync( + logFile, + [...queue, ...logs].slice(0, maxLines).join("\n") + ); + queue = []; + } + + locked = false; +} + +function push(line) { + writeLogs([line, ...getLogs()]); +} + +Logger.prototype.log = function (level, message) { + if (level > minLogLevel) return; + + const levelName = LogLevel[level]; + const date = new Date().toISOString(); + const line = `[${date}] [${levelName}] [${this._name}] ${message}`; + + push(line); + + if (watch && level < LogLevel.INFO) { + const color = colors[level] || colors[colors.length - 1]; + // eslint-disable-next-line no-console + console.log(color(line)); + } +}; diff --git a/app/server/libs/twitch/login.js b/app/server/libs/twitch/login.js new file mode 100644 index 00000000..1f38df7b --- /dev/null +++ b/app/server/libs/twitch/login.js @@ -0,0 +1,16 @@ +const state = require("./state"); +const initEvents = require("./initEvents"); +const getConnectedUser = require("./api/getConnectedUser"); + +let user = null; + +module.exports = async function login() { + if (user) return user; + + user = await getConnectedUser(); + state.set("user", user); + + await initEvents(); + + return user; +}; diff --git a/app/server/libs/twitch/plugins/followsPlugin.js b/app/server/libs/twitch/plugins/followsPlugin.js new file mode 100644 index 00000000..8b8b7aa0 --- /dev/null +++ b/app/server/libs/twitch/plugins/followsPlugin.js @@ -0,0 +1,16 @@ +const getLastFollows = require("../api/getLastFollows"); +const pushActions = require("../pushActions"); + +module.exports = async function streamStatePlugin({ delay = 2 } = {}) { + const follows = await getLastFollows(); + + follows.forEach((viewer) => { + pushActions("onFollow", { user: viewer.name }); + }); + + if (follows.length) { + console.log("New follows:", follows.length); + } + + setTimeout(streamStatePlugin, delay * 1000); +}; diff --git a/app/server/libs/twitch/plugins/install.js b/app/server/libs/twitch/plugins/install.js new file mode 100644 index 00000000..edd21910 --- /dev/null +++ b/app/server/libs/twitch/plugins/install.js @@ -0,0 +1,15 @@ +const updateFollowsPlugin = require("./updateFollowsPlugin"); +const streamStatePlugin = require("./streamState"); +const followsPlugin = require("./followsPlugin"); + +let installLock = false; + +module.exports = async function install() { + if (installLock) return; + + installLock = true; + + await updateFollowsPlugin(); + streamStatePlugin(); + followsPlugin(); +}; diff --git a/app/server/libs/twitch/plugins/streamState.js b/app/server/libs/twitch/plugins/streamState.js new file mode 100644 index 00000000..687aaf15 --- /dev/null +++ b/app/server/libs/twitch/plugins/streamState.js @@ -0,0 +1,9 @@ +const state = require("../state"); +const getStreamByChannel = require("../api/getStreamByChannel"); + +module.exports = async function streamStatePlugin({ delay = 10 } = {}) { + const channel = state.get("user.display_name"); + const stream = await getStreamByChannel(channel); + state.set("stream", stream); + setTimeout(streamStatePlugin, delay * 1000); +}; diff --git a/app/server/libs/twitch/plugins/updateFollowsPlugin.js b/app/server/libs/twitch/plugins/updateFollowsPlugin.js new file mode 100644 index 00000000..579d81a1 --- /dev/null +++ b/app/server/libs/twitch/plugins/updateFollowsPlugin.js @@ -0,0 +1,8 @@ +const Viewer = require("../../../db/Models/Viewer"); +const getFollows = require("../api/getFollows"); + +module.exports = async function updateFollowPlugin() { + const all = await Viewer.findAll(); + if (all.length) return; + await getFollows(); +}; diff --git a/app/server/libs/twitch/pubsub/index.js b/app/server/libs/twitch/pubsub/index.js new file mode 100644 index 00000000..daa5f678 --- /dev/null +++ b/app/server/libs/twitch/pubsub/index.js @@ -0,0 +1,44 @@ +const { BasicPubSubClient, PubSubClient } = require("twitch-pubsub-client"); +const onRedemption = require("./onRedemption"); +const onBits = require("./onBits"); +const twitch = require("../index"); +const state = require("../state"); + +let connectId = null; +const reconnectDelay = 5; // seconds + +const rootClient = new BasicPubSubClient(); +const pubSubClient = new PubSubClient(rootClient); + +function delayConnect() { + connectId && clearTimeout(connectId); + connectId = setTimeout(reconnect, reconnectDelay * 1000); +} + +function reconnect() { + state.set("pubsub.connected", false); + rootClient + .reconnect() + .then(() => { + state.set("pubsub.connected", true); + }) + .catch(() => { + delayConnect(); + }); +} + +rootClient.onDisconnect((manually) => { + state.set("pubsub.connected", false); + if (!manually) delayConnect(); +}); + +module.exports = async function init() { + state.set("pubsub.connected", false); + + const userId = await pubSubClient.registerUserListener(twitch.api); + + await pubSubClient.onRedemption(userId, onRedemption); + await pubSubClient.onBits(userId, onBits); + + state.set("pubsub.connected", true); +}; diff --git a/app/server/libs/twitch/pubsub/onBits.js b/app/server/libs/twitch/pubsub/onBits.js new file mode 100644 index 00000000..a7008624 --- /dev/null +++ b/app/server/libs/twitch/pubsub/onBits.js @@ -0,0 +1,12 @@ +const pushActions = require("../pushActions"); + +module.exports = async function onBits(message) { + const data = message._data.data; + + pushActions("onBits", { + user: data.is_anonymous ? "Anonymous" : data.user_name, + message: data.chat_message || "", + amount: data.bits_used, + total: data.total_bits_used, + }); +}; diff --git a/app/server/libs/twitch/pubsub/onRedemption.js b/app/server/libs/twitch/pubsub/onRedemption.js new file mode 100644 index 00000000..cf895feb --- /dev/null +++ b/app/server/libs/twitch/pubsub/onRedemption.js @@ -0,0 +1,11 @@ +const pushActions = require("../pushActions"); + +module.exports = async function onRedemption(message) { + const { id, user, reward, user_input } = message._data.data.redemption; + pushActions("onRedemption", { + id, + user: user.display_name, + reward, + message: user_input || "", + }); +}; diff --git a/app/server/libs/twitch/pushActions.js b/app/server/libs/twitch/pushActions.js new file mode 100644 index 00000000..1e4e7719 --- /dev/null +++ b/app/server/libs/twitch/pushActions.js @@ -0,0 +1,34 @@ +const stores = require("../../../stores"); +const { push } = require("../actions"); + +const types = { + AnimeTimeline: "anime", + SceneList: "obs", + ToggleScene: "obs", + GoToScene: "obs", +}; + +function isInvalidCommand(widget, eventProps) { + return eventProps.command && widget.commandName !== eventProps.command.name; +} + +function isInvalidReward(widget, eventProps) { + return eventProps.reward && widget.rewardId !== eventProps.reward.id; +} + +module.exports = function pushActions(eventName, eventProps) { + stores.panels.get("panels").forEach(({ widgets }) => { + widgets.forEach((widget) => { + if (!widget.component) return; + + const type = types[widget.component.name]; + + if (!["anime", "obs"].includes(type)) return; + if (widget.eventName !== eventName) return; + if (isInvalidReward(widget, eventProps)) return; + if (isInvalidCommand(widget, eventProps)) return; + + push({ type, widget, eventProps }); + }); + }); +}; diff --git a/app/server/libs/twitch/state.js b/app/server/libs/twitch/state.js new file mode 100644 index 00000000..4fa56912 --- /dev/null +++ b/app/server/libs/twitch/state.js @@ -0,0 +1,35 @@ +const socket = require("../socket.io"); +const dotProp = require("dot-prop"); + +const io = socket(); + +let state = { + user: null, + stream: null, + chat: { + connecting: false, + connected: false, + registered: false, + joinedChannels: [], + }, + pubsub: { + connected: false, + }, +}; + +function get(key = null, defaultValue = null) { + return key ? dotProp.get(state, key, defaultValue) : { ...state }; +} + +function set(key, value) { + dotProp.set(state, key, value); + const rootKey = key.split(".").shift(); + io.emit(`twitch.state.${rootKey}`, get(rootKey)); +} + +// function update(newState) { +// state = { ...state, ...newState }; +// io.emit("twitch.state", state); +// } + +module.exports = { get, set }; diff --git a/app/server/utils.js b/app/server/utils.js new file mode 100644 index 00000000..072515bf --- /dev/null +++ b/app/server/utils.js @@ -0,0 +1,10 @@ +const settings = require("./libs/settings"); + +async function getServerURL() { + const { host, port } = await settings.getAll("server."); + return `http://${host}:${port}`; +} + +module.exports = { + getServerURL, +}; diff --git a/app/static/icon.ico b/app/static/icon.ico new file mode 100644 index 00000000..687fa872 Binary files /dev/null and b/app/static/icon.ico differ diff --git a/app/static/icon.svg b/app/static/icon.svg new file mode 100644 index 00000000..022f3281 --- /dev/null +++ b/app/static/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/static/icon_macos.png b/app/static/icon_macos.png new file mode 100644 index 00000000..41abca2d Binary files /dev/null and b/app/static/icon_macos.png differ diff --git a/app/static/locales/en/app.json b/app/static/locales/en/app.json index 71cb3bf3..5e61b6e5 100644 --- a/app/static/locales/en/app.json +++ b/app/static/locales/en/app.json @@ -2,13 +2,16 @@ "sentences": { "welcome-message": "Welcome home", "waiting-for-connexion": "Waiting for connexion", - "ask-for-client-reload": "Would you like to reload the application now to apply changes ?", + "ask-for-client-reload": "Would you like to reload the application now to apply changes?", "open-in-window": "Open in window", "open-in-browser": "Open in browser", - "no-panels-found": "No panel found o_O ! Click on the cross to add your first group of powers !", - "powers-group": "Powers group", + "no-panel-found": "No panel found o_O!", + "open-edit-mode": "Switch to edit mode by clicking on the pencil.", + "click-to-add-panel": "Click on '+' to add your first panel!", + "click-to-add-widget": "Click on '+' to add your first widget!", + "powers-group": "Panel", "ask-for-panel-deletion": "Would you like to remove the panel \"{{name}}\"?", - "no-widgets-found": "No widgets found o_O ! Click on the cog button to add your first power !", + "no-widget-found": "No widget found o_O!", "add-grid-widget": "add widget", "ask-for-widget-deletion": "Would you like to remove the widget \"{{name}}\"?", "widget-settings": "Widget settings", @@ -28,7 +31,36 @@ "ask-remove-file": "Are you sure you want to permanently delete \"{{filename}}\"?", "file-can-be-used-by-other-widgets": "This file can be used by other widgets!", "obs-not-connected": "OBS not connected!", - "open-anime-timeline": "Open animation timeline" + "open-anime-timeline": "Open animation timeline", + "no-file-selected": "No file selected", + "no-file-added": "No file added", + "add-file-to-timeline": "Click on the blue arrow to add some file.", + "electron-open-on-startup": "Open Marv minified", + "connect-with-twitch": "Connect with Twitch", + "open-twitch-chat-window": "Open Twitch chat", + "dont-ask-me-again": "Dont ask me again", + "first-start-title": "This is your first start ! Happy :)", + "loading-fonts-list": "Loading fonts list", + "double-click-to-edit": "Click me twice", + "edit-mode": "Edit mode", + "add-panel": "Add panel", + "command-name-must-be-unique": "Command name must be unique.", + "check-update-at-startup": "Check update at startup", + "new-version-available": "A new version is available", + "close-marv-before-update": "Close Marv before launching the update!", + "close-app": "Close Marv!", + "file-upload-progress": "Upload in progress", + "insert-text-file": "Insert text file", + "get-started": "Get started", + "ask-remove-action": "Are you sure you want to delete \"{{action}}\"?", + "edit-grid": "Edit the grid", + "right-click-to-show-menu": "Right click to display the menu.", + "supports-ejs-syntax": "Supports EJS syntax", + "move-widget-to": "Move widget to", + "move-to": "Move to", + "command-settings": "Command settings", + "edit-action": "Edit action", + "edit-styles": "Edit styles" }, "words": { "settings": "settings", @@ -58,16 +90,153 @@ "none": "none", "scene": "scene", "trigger": "trigger", - "easing": "easing" + "easing": "easing", + "language": "language", + "keyframe": "keyframe", + "theme": "theme", + "channel": "channel", + "loading": "loading", + "download": "download", + "event": "event", + "muted": "muted", + "autoplay": "autoplay", + "info": "info", + "attributes": "attributes", + "styles": "styles", + "transformations": "transformations", + "command": "command", + "immediat": "immediat", + "queue": "queue", + "asap": "asap", + "add": "add", + "usage": "usage", + "description": "description", + "cooldown": "cooldown", + "done": "done", + "back": "back", + "width": "width", + "height": "height", + "disabled": "disabled", + "reward": "reward", + "online": "online", + "offline": "offline", + "top": "top", + "bottom": "bottom", + "left": "left", + "center": "center", + "right": "right", + "refresh": "refresh", + "all": "words.all", + "top left": "top left", + "top right": "top right", + "bottom left": "bottom left", + "bottom right": "bottom right", + "error": "error", + "help": "help", + "prefix": "prefix", + "save": "save", + "cancel": "cancel", + "filename": "filename", + "donate": "donate", + "recording": "Rec.:", + "live": "Live:", + "variables": "variables", + "message": "message", + "move": "move", + "duplicate": "duplicate", + "close": "close", + "confirm": "confirm" }, "obs": { "scene-list": "OBS | Scene list", "go-to-scene": "OBS | Go to scene", - "toggle-scene": "OBS toggle between two scenes", + "toggle-scene": "OBS | toggle between two scenes", "no-scene-selected": "No scene selected", - "connect-at-startup": "OBS connect at startup" + "connect-at-startup": "Connect OBS at startup", + "first-start-install-sentence": "If you want to use OBS with Marv you need to install OBS WebSocket.", + "overlay-install-sentence": "To install Marv, create a browser source in OBS with the url below.", + "check-disable-source-not-visible": "Check: Shutdown source when not visible.", + "check-refresh-browser-on-activate": "Check: Refresh browser when scene becomes active.", + "overlay-not-found": "Overlay not found" }, "anime": { "timeline": "Anime | Timeline" + }, + "twitch": { + "chat": "Twitch chat", + "stream": "Twitch stream", + "commands": "Commands", + "rewards": "Rewards", + "followers": "Followers", + "connect-at-startup": "Connect Twitch at startup", + "empty-command-list": "Empty command list", + "command-cooldown": "Cooldown \"{{command}}\" -> ~{{rest}}", + "command-too-much-argument": "Too much argument! Usage: {{usage}}", + "command-not-enough-argument": "Not enough argument! Usage: {{usage}}", + "empty-follower-list": "The follower list is empty.", + "empty-reward-list": "The rewards list is empty.", + "events": { + "none": "None", + "onFollow": "Follow", + "onAction": "Action", + "onBan": "Ban", + "onBitsBadgeUpgrade": "Bits badge upgrade", + "onCommunityPayForward": "Community pay forward", + "onCommunitySub": "Community sub", + "onGiftPaidUpgrade": "Gift paid upgrade", + "onHosted": "Hosted", + "onJoin": "Join", + "onMessage": "Message", + "onPart": "Part", + "onPrimeCommunityGift": "Prime community gift", + "onPrimePaidUpgrade": "Prime paid upgrade", + "onRaid": "Raid", + "onResub": "Resub", + "onRewardGift": "Reward gift", + "onRitual": "Ritual", + "onStandardPayForward": "Standard pay forward", + "onSub": "Sub", + "onSubExtend": "Sub extend", + "onSubGift": "Sub gift", + "onCommand": "Command", + "onRedemption": "Redemption", + "onBits": "Bits" + } + }, + "labels": { + "top": "top", + "left": "left", + "width": "width", + "height": "height", + "font-size": "font size", + "font-family": "font family", + "font-weight": "font weight", + "text-align": "align", + "color": "color", + "opacity": "opacity", + "z-index": "z index", + "-webkit-text-stroke-width": "stroke width", + "-webkit-text-stroke-color": "stroke color", + "length": "length", + "rotate": "rotate", + "scale": "scale", + "translateX": "translate X", + "translateY": "translate Y", + "translateZ": "translate Z", + "timming": "timming", + "volume": "volume", + "delay": "delay", + "duration": "duration", + "rotateX": "rotate X", + "rotateY": "rotate Y", + "rotateZ": "rotate Z", + "scaleX": "scale X", + "scaleY": "scale Y", + "scaleZ": "scale Z", + "skew": "skew", + "skewX": "skew X", + "skewY": "skew Y", + "perspective": "perspective", + "text-shadow": "text shadow" } -} +} \ No newline at end of file diff --git a/app/static/locales/es/app.json b/app/static/locales/es/app.json new file mode 100644 index 00000000..2b7a7f9c --- /dev/null +++ b/app/static/locales/es/app.json @@ -0,0 +1,241 @@ +{ + "sentences": { + "welcome-message": "Bienvenido", + "waiting-for-connexion": "En espera de establecer la connexion", + "ask-for-client-reload": "Aplicar las modificaciones?", + "open-in-window": "Abrir en una ventana", + "open-in-browser": "Abrir en el navegador", + "no-panel-found": "Ningun panel encontrado o_O!", + "open-edit-mode": "Pasar en modo edición presionando el lápiz.", + "click-to-add-panel": "Presione '+' para añadir tu primer panel.", + "click-to-add-widget": "Presione '+' para añadir tu primer widget.", + "powers-group": "Panel", + "ask-for-panel-deletion": "Eliminar \"{{name}}\"?", + "no-widget-found": "Ningún botón encontrado o_O!", + "add-grid-widget": "Añadir un botón.", + "ask-for-widget-deletion": "Eliminar el botón \"{{name}}\"?", + "widget-settings": "Normas del botón.", + "background-color": "Color de fondo", + "file-manager": "Administrador de archivos", + "open-file-manager": "Abrir administrador de archivos", + "select-file": "Seleccionar un archivo", + "browse-file": "Buscar un archivo", + "upload-file": "Añadir un archivo", + "file-already-exists": "El archivo ya existe.", + "disallowed-file-type": "Tipo de archivo no autorizado.", + "obs-is-not-initialized": "OBS no ha sido inicializado.", + "file-is-empty": "El archivo está vacío.", + "file-list-empty": "Ningún archivo", + "file-uploaded-successfully": "Archivo añadido", + "background-image": "Imagen de fondo", + "ask-remove-file": "Eliminar definitivamente \"{{filename}}\"?", + "file-can-be-used-by-other-widgets": "El archivo puede ser utilizado por otros botones!", + "obs-not-connected": "OBS no esta conectado !", + "open-anime-timeline": "Abrir Timeline", + "no-file-selected": "Ningún archivo seleccionado", + "no-file-added": "Ningún archivo añadido", + "add-file-to-timeline": "Añadir un archivo.", + "electron-open-on-startup": "Abrir Marv minimizado", + "connect-with-twitch": "Conectarse a Twitch", + "open-twitch-chat-window": "Abrir el chat de Twitch", + "dont-ask-me-again": "No volver a mostrar", + "first-start-title": "Connexión a OBS !", + "loading-fonts-list": "Cargando fuentes", + "double-click-to-edit": "Presioname dos veces", + "edit-mode": "Modo edición", + "add-panel": "Añadir un panel", + "command-name-must-be-unique": "El nombre del comando debe ser único.", + "check-update-at-startup": "Verifique actualizaciones al inicio", + "new-version-available": "Una nueva versión esta disponible", + "close-marv-before-update": "Cierre Marv antes de iniciar la actualización !", + "close-app": "Cierre Marv !", + "file-upload-progress": "Subida en curso", + "insert-text-file": " Inserta archivo de texto", + "get-started": "Inicio rápido", + "ask-remove-action": "Eliminar \"{{action}}\"?", + "edit-grid": "Editar la cuadrícula", + "right-click-to-show-menu": "Haga clic con el botón derecho del ratón para mostrar el menú.", + "supports-ejs-syntax": "Supports EJS syntax", + "move-widget-to": "Mover el panel a", + "move-to": "Mover a", + "command-settings": "Ajustes de los comandos", + "edit-action": "Editar acción", + "edit-styles": "Editar apariencia" + }, + "words": { + "settings": "opciones", + "yes": "si", + "no": "no", + "connect": "conexión", + "disconnect": "deconexión", + "connected": "conectado", + "disconnected": "desconectado", + "connecting": "conectando", + "off": "apagando", + "stream": "difusión", + "record": "grabando", + "quit": "salir", + "remove": "eliminar", + "rename": "renombrar", + "label": "Titulo", + "size": "talla", + "padding": "márgenes", + "align": "alineamiento", + "color": "color", + "borders": "bordes", + "delete": "eliminar", + "warning": "atención", + "position": "posición", + "component": "Tipo de elemento", + "none": "ningún", + "scene": "escena", + "trigger": "desencadenar", + "easing": "easing", + "language": "idioma", + "keyframe": "Llave de animación", + "theme": "Tema", + "channel": "canal", + "loading": "cargando", + "download": "descargar", + "event": "evento", + "muted": "Mutearse", + "autoplay": "lectura automatica", + "info": "info", + "attributes": "atributos", + "styles": "estilos", + "transformations": "transformaciones", + "command": "comando", + "immediat": "inmediato", + "queue": "cola", + "asap": "asap", + "add": "añadir", + "usage": "utilización", + "description": "descripción", + "cooldown": "cooldown", + "done": "terminado", + "back": "volver", + "width": "anchura", + "height": "altura", + "disabled": "desactivado", + "reward": "recompensa", + "online": "en directo", + "offline": "hors live", + "top": "arriba", + "bottom": "abajo", + "left": "izquierda", + "center": "centro", + "right": "derecha", + "refresh": "actualizar ", + "all": "todos", + "top left": "arriba izquierda", + "top right": "arriba derecha", + "bottom left": "abajo izquierda", + "bottom right": "abajo derecha", + "error": "error", + "help": "ayuda", + "save": "guardar", + "cancel": "cancelar", + "filename": "nombre del archivo", + "donate": "donar", + "recording": "Rec.:", + "live": "Live:", + "variables": "variables", + "message": "message", + "move": "mover", + "duplicate": "duplicado", + "close": "cerrar", + "confirm": "confirmar" + }, + "obs": { + "scene-list": "OBS | Lista de escenas", + "go-to-scene": "OBS | Ir a la escena", + "toggle-scene": "OBS | Cambiar entre dos escenas", + "no-scene-selected": "Ninguna escena seleccionada", + "connect-at-startup": "Conectar a OBS al inicio", + "first-start-install-sentence": "Para conectar Marv a OBS, debes instalar OBS WebSocket.", + "overlay-install-sentence": "Para instalar Marv, crea una fuente del navegador en OBS con el enlance de abajo.", + "check-disable-source-not-visible": "Marque la casilla: Desactivar la fuente en la que no este visible.", + "check-refresh-browser-on-activate": "Marque la casilla: Recargar el navegador cuando la escena sea activa.", + "overlay-not-found": "Overlay no encontrado" + }, + "anime": { + "timeline": "Anime | Timeline" + }, + "twitch": { + "chat": "chat de Twitch", + "stream": "directo de Twitch", + "commands": "Comandos", + "rewards": "Recompensas", + "followers": "Partidarios", + "connect-at-startup": "Conectar a Twitch durante el inicio", + "empty-command-list": "Ningun comando", + "command-cooldown": "Cooldown \"{{command}}\" -> ~{{rest}}", + "command-too-much-argument": "Demasiados argunmentos! Utilización: {{usage}}", + "command-not-enough-argument": "No hay suficientes argunmentos! Utilización: {{usage}}", + "empty-follower-list": "La lista de partidarios esta vacía.", + "empty-reward-list": "La lista de recompensas esta vacía.", + "events": { + "none": "Ningún", + "onFollow": "Seguir", + "onAction": "Acción", + "onBan": "Banear", + "onBitsBadgeUpgrade": "Actualización de la insignia de Bits", + "onCommunityPayForward": "Community pay forward", + "onCommunitySub": "Community sub", + "onGiftPaidUpgrade": "Gift paid upgrade", + "onHosted": "Hosteado", + "onJoin": "Unido", + "onMessage": "Mensaje", + "onPart": "Parte", + "onPrimeCommunityGift": "Prime community gift", + "onPrimePaidUpgrade": "Prime paid upgrade", + "onRaid": "Raid", + "onResub": "Re suscripción", + "onRewardGift": "Reward gift", + "onRitual": "Ritual", + "onStandardPayForward": "Standard pay forward", + "onSub": "Suscribió", + "onSubExtend": "Sub extend", + "onSubGift": "Sub gift", + "onCommand": "Comando", + "onRedemption": "Redemption", + "onBits": "Bits" + } + }, + "labels": { + "top": "arriba", + "left": "izquierda", + "width": "anchura", + "font-size": "talla de fuente", + "font-family": "fuentes", + "font-weight": "texto en negrita", + "text-align": "alineamniento del texto", + "color": "color", + "opacity": "opacidad", + "z-index": "prioridad de visualización", + "-webkit-text-stroke-width": "ancho de línea", + "-webkit-text-stroke-color": "color de línea", + "length": "anchura", + "rotate": "rotación", + "scale": "escala", + "translateX": "translación X", + "translateY": "translación Y", + "translateZ": "translación Z", + "timming": "cronología", + "volume": "volumen", + "delay": "delay", + "duration": "duración", + "rotateX": "rotación X", + "rotateY": "rotación Y", + "rotateZ": "rotación Z", + "scaleX": "escala X", + "scaleY": "escala y", + "scaleZ": "escala z", + "skew": "distorsión", + "skewX": "distorsión x", + "skewY": "distorsión y", + "perspective": "punto de vista", + "height": "altura", + "text-shadow": "sombra" + } +} \ No newline at end of file diff --git a/app/static/locales/fr/app.json b/app/static/locales/fr/app.json index 4e32b819..70448484 100644 --- a/app/static/locales/fr/app.json +++ b/app/static/locales/fr/app.json @@ -2,33 +2,65 @@ "sentences": { "welcome-message": "Bienvenue chez toi", "waiting-for-connexion": "En attente de connexion", - "ask-for-client-reload": "Souhaite-tu actualiser l'application maintenant pour appliquer les modifications?", + "ask-for-client-reload": "Appliquer les modifications ?", "open-in-window": "Ouvrir dans une fenêtre", "open-in-browser": "Ouvrir dans le navigateur", - "no-panels-found": "Aucun panneau trouvé o_O! Clique sur la croix pour ajouter ton premier groupe de pouvoirs!", - "powers-group": "Group de pouvoirs", - "ask-for-panel-deletion": "Tu veux vraiment supprimer le paneau \"{{name}}\"?", - "no-widgets-found": "Aucun widget trouvé o_O! Cliquez sur le bouton avec l'engrenage pour passé en mode édition, puis clique sur le bouton avec le petit plus pour ajouter ton premier pouvoir!", - "add-grid-widget": "ajouter un pouvoir", - "ask-for-widget-deletion": "Tu veux vraiment supprimer le widget \"{{name}}\"?", - "widget-settings": "Réglages du widget", + "no-panel-found": "Aucun panneau trouvé o_O !", + "open-edit-mode": "Passe en mode édition en cliquant sur l'crayon.", + "click-to-add-panel": "Clique sur '+' pour ajouter ton premier panneau.", + "click-to-add-widget": "Clique sur '+' pour ajouter ton premier bouton.", + "powers-group": "Panneau", + "ask-for-panel-deletion": "Supprimer le panneau \"{{name}}\" ainsi que tous ses boutons?", + "no-widget-found": "Aucun bouton trouvé o_O !", + "add-grid-widget": "Ajouter un bouton", + "ask-for-widget-deletion": "Supprimer le bouton \"{{name}}\" ?", + "widget-settings": "Réglages du bouton", "background-color": "Couleur de fond", - "file-manager": "Gestionnaire de fichier", - "open-file-manager": "Ouvrir le gestionnaire de fichier", + "file-manager": "Gestionnaire de fichiers", + "open-file-manager": "Ouvrir le gestionnaire de fichiers", "select-file": "Sélectionner un fichier", "browse-file": "Chercher un fichier", - "upload-file": "Téléverser un fichier", + "upload-file": "Ajouter un fichier", "file-already-exists": "Le fichier existe déjà.", "disallowed-file-type": "Type de fichier non autorisé.", "obs-is-not-initialized": "OBS n'est pas initialisé.", "file-is-empty": "Le fichier est vide.", - "file-list-empty": "La liste de fichier est vide.", - "file-uploaded-successfully": "Fichier téléchargé avec succès.", + "file-list-empty": "Aucun fichier", + "file-uploaded-successfully": "Fichier ajouté", "background-image": "Image de fond", - "ask-remove-file": "Êtes-vous sûr de vouloir supprimer définitivement \"{{filename}}\"?", - "file-can-be-used-by-other-widgets": "Ce fichier peut être utilisé par d'autre widgets!", - "obs-not-connected": "OBS n'est pas connecté!", - "open-anime-timeline": "Ouvrir la timeline" + "ask-remove-file": "Supprimer définitivement \"{{filename}}\" ?", + "file-can-be-used-by-other-widgets": "Ce fichier peut être utilisé par d'autres boutons !", + "obs-not-connected": "OBS n'est pas connecté !", + "open-anime-timeline": "Ouvrir Timeline", + "no-file-selected": "Aucun fichier sélectionné", + "no-file-added": "Aucun fichier", + "add-file-to-timeline": "Ajouter un fichier.", + "electron-open-on-startup": "Ouvrir Marv réduit", + "connect-with-twitch": "Se connecter à Twitch", + "open-twitch-chat-window": "Ouvrir le chat Twitch", + "dont-ask-me-again": "Ne plus afficher", + "first-start-title": "Connexion à OBS !", + "loading-fonts-list": "Chargement des polices", + "double-click-to-edit": "Clique-moi 2x", + "edit-mode": "Mode édition", + "add-panel": "Ajouter un panneau", + "command-name-must-be-unique": "Le nom de la commande doit être unique.", + "check-update-at-startup": "Vérifier la mise à jour au démarrage", + "new-version-available": "Une nouvelle version est disponible", + "close-marv-before-update": "Fermez Marv avant de lancer la mise à jour !", + "close-app": "Fermer Marv !", + "file-upload-progress": "Téléversement en cours", + "insert-text-file": "Insérer un fichier", + "get-started": "Démarrage rapide", + "ask-remove-action": "Supprimer \"{{action}}\" ?", + "edit-grid": "Editer la grille", + "right-click-to-show-menu": "Clique droit pour afficher le menu.", + "supports-ejs-syntax": "Supporte la syntaxe EJS", + "move-widget-to": "Déplacer le bouton vers", + "move-to": "Déplacer vers...", + "command-settings": "Paramètres de commande", + "edit-action": "Editer l'action", + "edit-styles": "Editer l'apparence" }, "words": { "settings": "options", @@ -45,29 +77,166 @@ "quit": "quitter", "remove": "supprimer", "rename": "renommer", - "label": "label", + "label": "Titre", "size": "taille", "padding": "marges", "align": "alignement", "color": "couleur", "borders": "bordures", - "delete": "delete", + "delete": "supprimer", "warning": "attention", "position": "position", - "component": "composant", + "component": "Type d'élément", "none": "aucun", "scene": "scène", - "trigger": "lanceur", - "easing": "easing" + "trigger": "déclenchement", + "easing": "easing", + "language": "langue", + "keyframe": "Clé d'animation", + "theme": "Thème", + "channel": "chaîne", + "loading": "chargement", + "download": "télécharger", + "event": "évènement", + "muted": "Rendre muet", + "autoplay": "lecture automatique", + "info": "info", + "attributes": "attributs", + "styles": "styles", + "transformations": "transformations", + "command": "commande", + "immediat": "immédiat", + "queue": "queue", + "asap": "asap", + "add": "ajouter", + "usage": "utilisation", + "description": "déscription", + "cooldown": "cooldown", + "done": "terminé", + "back": "retour", + "width": "largeur", + "height": "hauteur", + "disabled": "désactivé", + "reward": "récompense", + "online": "en live", + "offline": "hors live", + "top": "haut", + "bottom": "bas", + "left": "gauche", + "center": "centre", + "right": "droite", + "refresh": "actualiser ", + "all": "tous", + "top left": "haut gauche", + "top right": "haut droite", + "bottom left": "bas gauche", + "bottom right": "bas droite", + "error": "erreur", + "help": "aide", + "prefix": "préfixe", + "save": "sauver", + "cancel": "annuler", + "filename": "nom du fichier", + "donate": "dons", + "recording": "Rec. :", + "live": "Live :", + "variables": "variables", + "message": "message", + "move": "déplacer", + "duplicate": "dupliquer", + "close": "fermer", + "confirm": "confirmer" }, "obs": { "scene-list": "OBS | Liste des scènes", "go-to-scene": "OBS | Aller à la scène", "toggle-scene": "OBS | Basculer entre deux scènes", "no-scene-selected": "Aucune scène sélectionnée", - "connect-at-startup": "OBS connection au démarrage" + "connect-at-startup": "Connecter OBS au démarrage", + "first-start-install-sentence": "Pour connecter Marv à OBS, tu dois installer OBS WebSocket.", + "overlay-install-sentence": "Pour installer Marv, créer une source navigateur dans OBS avec l'url ci-dessous.", + "check-disable-source-not-visible": "Coche la case: Désactiver la source quand elle n'est pas visible.", + "check-refresh-browser-on-activate": "Coche la case: Rafraîchir le navigateur lorsque la scène devient active.", + "overlay-not-found": "Overlay non trouvé" }, "anime": { "timeline": "Anime | Timeline" + }, + "twitch": { + "chat": "Twitch chat", + "stream": "Twitch stream", + "commands": "Commandes", + "rewards": "Récompenses", + "followers": "Supporters", + "connect-at-startup": "Connecter Twitch au démarrage", + "empty-command-list": "Aucune commande", + "command-cooldown": "Cooldown \"{{command}}\" -> ~{{rest}}", + "command-too-much-argument": "Trop d'argument! Usage: {{usage}}", + "command-not-enough-argument": "Pas assez d'argument! Usage: {{usage}}", + "empty-follower-list": "La liste des supporters est vide.", + "empty-reward-list": "La liste des récompenses est vide.", + "events": { + "none": "Aucun", + "onFollow": "Follow", + "onAction": "Action", + "onBan": "Ban", + "onBitsBadgeUpgrade": "Bits badge upgrade", + "onCommunityPayForward": "Community pay forward", + "onCommunitySub": "Community sub", + "onGiftPaidUpgrade": "Gift paid upgrade", + "onHosted": "Hosted", + "onJoin": "Join", + "onMessage": "Message", + "onPart": "Part", + "onPrimeCommunityGift": "Prime community gift", + "onPrimePaidUpgrade": "Prime paid upgrade", + "onRaid": "Raid", + "onResub": "Resub", + "onRewardGift": "Reward gift", + "onRitual": "Ritual", + "onStandardPayForward": "Standard pay forward", + "onSub": "Sub", + "onSubExtend": "Sub extend", + "onSubGift": "Sub gift", + "onCommand": "Command", + "onRedemption": "Redemption", + "onBits": "Bits" + } + }, + "labels": { + "top": "haut", + "left": "gauche", + "width": "largeur", + "font-size": "taille du texte", + "font-family": "polices", + "font-weight": "texte en gras", + "text-align": "alignement du texte", + "color": "couleur", + "opacity": "opacité", + "z-index": "prioriter d'affichage", + "-webkit-text-stroke-width": "largeur du trait", + "-webkit-text-stroke-color": "couleur du trait", + "length": "longueur", + "rotate": "rotation", + "scale": "échelle", + "translateX": "translation X", + "translateY": "translation Y", + "translateZ": "translation Z", + "timming": "chronologie", + "volume": "volume", + "delay": "délai", + "duration": "durée", + "rotateX": "rotation X", + "rotateY": "rotation Y", + "rotateZ": "rotation Z", + "scaleX": "échelle X", + "scaleY": "échelle Y", + "scaleZ": "échelle Z", + "skew": "distorsion", + "skewX": "distorsion X", + "skewY": "distorsion Y", + "perspective": "point de vue", + "height": "hauteur", + "text-shadow": "ombre" } -} +} \ No newline at end of file diff --git a/app/stores/create.js b/app/stores/create.js index 23593e5a..370a553c 100644 --- a/app/stores/create.js +++ b/app/stores/create.js @@ -1,8 +1,9 @@ +const { storesPath } = require("../utils"); const Conf = require("conf"); class Store extends Conf { constructor(name, options = {}) { - super({ ...options, configName: name }); + super({ ...options, configName: name, cwd: storesPath }); } getAll() { diff --git a/app/stores/defaults/app.js b/app/stores/defaults/app.js deleted file mode 100644 index e5edfa82..00000000 --- a/app/stores/defaults/app.js +++ /dev/null @@ -1,13 +0,0 @@ -const { name, version } = require("../../package"); -const { watch, appPath } = require("../utils"); -const path = require("path"); - -module.exports = { - name, - version, - path: appPath, - production: !watch, - openOnStartup: false, - fingerprint: `${name} v${version}`, - icon: path.join(appPath, "static/icon.png"), -}; diff --git a/app/stores/defaults/obs.js b/app/stores/defaults/obs.js deleted file mode 100644 index 710a41dc..00000000 --- a/app/stores/defaults/obs.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - host: "localhost", - port: 4444, - password: null, - connectOnStartup: false, -}; diff --git a/app/stores/defaults/server.js b/app/stores/defaults/server.js deleted file mode 100644 index b029953e..00000000 --- a/app/stores/defaults/server.js +++ /dev/null @@ -1,14 +0,0 @@ -const { name } = require("../../package"); -const { appPath } = require("../utils"); -const envPaths = require("env-paths"); -const path = require("path"); - -const userDir = envPaths(name).data; - -module.exports = { - port: 4242, - host: "localhost", - clientPath: path.join(appPath, "client"), - staticPath: path.join(appPath, "static"), - uploadPath: path.join(userDir, "files"), -}; diff --git a/app/stores/utils.js b/app/stores/utils.js deleted file mode 100644 index 01eacb34..00000000 --- a/app/stores/utils.js +++ /dev/null @@ -1,9 +0,0 @@ -const path = require("path"); - -const appPath = path.resolve(__dirname, ".."); -const watch = process.argv.includes("--watch") || process.argv.includes("-w"); - -module.exports = { - watch, - appPath, -}; diff --git a/app/utils.js b/app/utils.js new file mode 100644 index 00000000..828799e8 --- /dev/null +++ b/app/utils.js @@ -0,0 +1,47 @@ +const { name, version } = require("./package"); +const capitalize = require("capitalize"); +const envPaths = require("env-paths"); +const fs = require("fs-extra"); +const path = require("path"); + +const app = { name, version }; +const fingerprint = `${capitalize(name)} v${version}`; +const watch = process.argv.includes("--watch") || process.argv.includes("-w"); + +const appPath = __dirname; +let userPath = envPaths(name).data; + +if (watch) { + userPath += "-dev"; +} + +const clientPath = path.join(appPath, "client"); +const staticPath = path.join(appPath, "static"); + +const logsPath = path.join(userPath, "logs"); +const uploadPath = path.join(userPath, "upload"); +const storesPath = path.join(userPath, "stores"); +const databasePath = path.join(userPath, "database"); + +const filesPath = path.join(uploadPath, "files"); + +const databaseFilename = "marv.sqlite"; + +const isFirstStart = !fs.existsSync(path.join(databasePath, databaseFilename)); + +module.exports = { + app, + watch, + appPath, + userPath, + logsPath, + filesPath, + uploadPath, + storesPath, + staticPath, + clientPath, + fingerprint, + databasePath, + databaseFilename, + isFirstStart, +}; diff --git a/app/yarn.lock b/app/yarn.lock index fbc7fba0..d0c3b9c1 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -14,6 +14,100 @@ dependencies: regenerator-runtime "^0.13.4" +"@d-fischer/cache-decorators@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@d-fischer/cache-decorators/-/cache-decorators-2.1.1.tgz#0e702b69312406ecf747b76ad9fc644b154498d1" + integrity sha512-qdRejrYFStvdreFFUH4Tl1AvH+MV34vATj8yqrbis5HVwMqbLbLyb38H1hSKEiWFGBjLtCcgfJtC0LvgJivgzg== + dependencies: + "@d-fischer/shared-utils" "^2.4.1" + "@types/node" "^14.11.2" + tslib "^2.0.3" + +"@d-fischer/connection@^6.2.1": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@d-fischer/connection/-/connection-6.2.1.tgz#a631e91f3cdb37ccd64929e1f863b417c1173193" + integrity sha512-qQSMGHWjd/aE6c+lUGwxRYjur1iyD8siyuDDCYkdBYTVrvCGNSwNLgX8oRuR1UbKcM7evc1vQlxEIFGwr7lfcg== + dependencies: + "@d-fischer/isomorphic-ws" "^5.0.2" + "@d-fischer/logger" "^2.1.1" + "@d-fischer/shared-utils" "^2.4.1" + "@d-fischer/typed-event-emitter" "^3.1.1" + "@types/node" "^14.11.2" + "@types/ws" "^7.2.7" + tslib "^2.0.3" + ws "^7.3.1" + +"@d-fischer/cross-fetch@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@d-fischer/cross-fetch/-/cross-fetch-4.0.2.tgz#1a086c0066462fee196420748c283389c66fd5aa" + integrity sha512-3ONhZxPmgCerBi8rU9kDQktF2zMpv7gkVJuoR8I+pYeO4QWccEcqQem0i1mLBh7/y7ejR474RZb3S3EO/Sdi3A== + dependencies: + node-fetch "2.6.1" + +"@d-fischer/deprecate@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@d-fischer/deprecate/-/deprecate-2.0.2.tgz#d1f0d40acc881edd771cace7992a1070460608c8" + integrity sha512-wlw3HwEanJFJKctwLzhfOM6LKwR70FPfGZGoKOhWBKyOPXk+3a9Cc6S9zhm6tka7xKtpmfxVIReGUwPnMbIaZg== + +"@d-fischer/escape-string-regexp@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@d-fischer/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#40b1d52529c5674caf510213efc9c982877d01c4" + integrity sha512-7eoxnxcto5eVPW5h1T+ePnVFukmI9f/ZR9nlBLh1t3kyzJDUNor2C+YW9H/Terw3YnbZSDgDYrpCJCHtOtAQHw== + +"@d-fischer/isomorphic-ws@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@d-fischer/isomorphic-ws/-/isomorphic-ws-5.0.2.tgz#91bb78f520b6c9e4a820eb80c9be5dfeebdb08ed" + integrity sha512-FeULiS37jd5M7nroqUw7kfnntlIW6Kilr2kn38Xjoyw/WZqwdxSAihJ2Y09aoDamrVKEW9/flbo2/y/VwHVZ6g== + +"@d-fischer/logger@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@d-fischer/logger/-/logger-2.1.1.tgz#4c1abecd420188ba7259fdff8012272cb30d162f" + integrity sha512-E46n4a6AjSFCptzaQrw9y7FF0H2Rci4KJdi6QzjzqaGAHaxyA9IdpVcfKgpG4CCSTA0F6tD7LbgKNR0XoEHhPg== + dependencies: + detect-node "^2.0.4" + tslib "^2.0.3" + +"@d-fischer/promise.allsettled@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@d-fischer/promise.allsettled/-/promise.allsettled-2.0.1.tgz#3da8996ec95fd25017d0ec8289302c1b0afdce00" + integrity sha512-n3DCu++HfQBsuTRzwCk4hABtjQm+RgyPHecGTg6ze8ocCPKzSllsXQWTX7PEoQHKwoHEEoDiHzddTC62n+HZBA== + dependencies: + array.prototype.map "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.17.4" + iterate-value "^1.0.2" + +"@d-fischer/qs@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@d-fischer/qs/-/qs-7.0.2.tgz#21942f51590e20954086bdc32fb3e608d3525659" + integrity sha512-yAu3xDooiL+ef84Jo8nLjDjWBRk7RXk163Y6aTvRB7FauYd3spQD/dWvgT7R4CrN54Juhrrc3dMY7mc+jZGurQ== + +"@d-fischer/rate-limiter@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@d-fischer/rate-limiter/-/rate-limiter-0.2.7.tgz#58f8ebf4926fb110e7f20dbbc3c9fc5454e32670" + integrity sha512-gA2dRIyisT3YkcpOVGvNRbW3tw8X6RHZ10thsc4CpFerynZItNt5fHeP6SidORP8XvI6vBh0NJpwDMfVxcqWEg== + dependencies: + "@d-fischer/logger" "^2.1.1" + "@d-fischer/promise.allsettled" "^2.0.1" + "@types/node" "^12.12.5" + tslib "^2.0.3" + +"@d-fischer/shared-utils@^2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@d-fischer/shared-utils/-/shared-utils-2.4.1.tgz#6b2c63cf44130bd1a23c915eab34bc7637b1bdec" + integrity sha512-JFkiZ1s+Sx4uIoQ7mrMeOkxVxWBpnS4hCm6R7+UUciPmAR0qgKxNt7x079b3cUFTOSbbF0Inp6ReqNK4w/QgUQ== + dependencies: + "@types/node" "^14.11.2" + tslib "^2.0.3" + +"@d-fischer/typed-event-emitter@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@d-fischer/typed-event-emitter/-/typed-event-emitter-3.1.1.tgz#5858ce3c18fdb1c2ceaf3c6635d87c5f2a0ef02d" + integrity sha512-Tfk0ACUOzf292YwR7hFkLZWhgEAfFi9cqmc5zFHYQVNH/Vt5SLsrZrI4ZZaPGJGYpbtQl3726zNMg9Mqof7Ciw== + dependencies: + "@types/node" "^14.11.2" + tslib "^2.0.3" + "@polka/url@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" @@ -24,6 +118,48 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71" integrity sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA== +"@rushstack/ts-command-line@~4.7.7": + version "4.7.8" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.7.8.tgz#3aa77cf544c571be3206fc2bcba20c7a096ed254" + integrity sha512-8ghIWhkph7NnLCMDJtthpsb7TMOsVGXVDvmxjE/CeklTqjbbUFBjGXizJfpbEkRQTELuZQ2+vGn7sGwIWKN2uA== + dependencies: + "@types/argparse" "1.0.38" + argparse "~1.0.9" + colors "~1.2.1" + string-argv "~0.3.1" + +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== + +"@types/node@*", "@types/node@^14.11.2": + version "14.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.9.tgz#04afc9a25c6ff93da14deabd65dc44485b53c8d6" + integrity sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw== + +"@types/node@^12.12.5": + version "12.19.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.6.tgz#fbf249fa46487dd8c7386d785231368b92a33a53" + integrity sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ== + +"@types/verror@^1.10.4": + version "1.10.4" + resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.4.tgz#805c0612b3a0c124cf99f517364142946b74ba3b" + integrity sha512-OjJdqx6QlbyZw9LShPwRW+Kmiegeg3eWNI41MQQKaG3vjdU2L9SRElntM51HmHBY1cu7izxQJ1lMYioQh3XMBg== + +"@types/ws@^7.2.7": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.0.tgz#499690ea08736e05a8186113dac37769ab251a0e" + integrity sha512-Y29uQ3Uy+58bZrFLhX36hcI3Np37nqWE7ky5tjiDoy1GDZnIwVxS0CgF+s+1bXMzjKBFy+fqaRfb708iNzdinw== + dependencies: + "@types/node" "*" + +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== + accepts@~1.3.4: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -37,7 +173,7 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -ajv@^6.12.2: +ajv@^6.12.2, ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -47,6 +183,23 @@ ajv@^6.12.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +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.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -54,6 +207,11 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +any-promise@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -62,15 +220,63 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@~1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +array.prototype.map@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.3.tgz#1609623618d3d84134a37d4a220030c2bd18420b" + integrity sha512-nNcb30v0wfDyIe26Yif3PcV1JXQp4zEeEfupG7L4SRjnD6HLbO5b2a7eVSba53bOx4YCHYMBHt+Fp4vYstneRA== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.5" + arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +async@0.9.x: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= + +asynckit@^0.4.0: + version "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" @@ -82,32 +288,49 @@ atomically@^1.3.1: resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.6.0.tgz#d8d47f99834dbb88bd6266cc69a1447e2f3675ec" integrity sha512-mu394MH+yY2TSKMyH+978PcGMZ8sRNks2PuVeH6c2ED4mimR2LEE039MVcIGVhtmG54cKEMh4gKhxKL/CLaX/w== +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + base64-arraybuffer@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= - base64id@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -better-assert@~1.0.0: +bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: - callsite "1.0.0" + tweetnacl "^0.14.3" binary-extensions@^2.0.0: version "2.1.0" @@ -119,6 +342,13 @@ blob@0.0.5: resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + dependencies: + inherits "~2.0.0" + body-parser@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -135,6 +365,14 @@ body-parser@^1.19.0: raw-body "2.4.0" type-is "~1.6.17" +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -147,16 +385,33 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -callsite@1.0.0: +call-bind@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" capitalize@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/capitalize/-/capitalize-2.0.3.tgz#ccfeb1046d2a054eb30f34af907a70c3e90f3b73" integrity sha512-Qc5ksT1/zEJBbFYD05h99hCNEW0cgyD0zzE5WvkgisNnppJ+16zfaSk34evF0j6pGW8hejkRUeygJ5uN5k22SQ== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +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== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -180,6 +435,32 @@ chokidar@^3.4.3: optionalDependencies: fsevents "~2.1.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +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= + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + 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" @@ -187,11 +468,28 @@ color-convert@^2.0.1: 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.2.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" + integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + 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" + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" @@ -212,6 +510,11 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + conf@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/conf/-/conf-7.1.2.tgz#d9678a9d8f04de8bf5cd475105da8fdae49c2ec4" @@ -228,15 +531,32 @@ conf@^7.1.2: pkg-up "^3.1.0" semver "^7.3.2" +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" debounce-fn@^4.0.0: version "4.0.0" @@ -252,10 +572,17 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" @@ -273,11 +600,43 @@ debug@~4.1.0: dependencies: ms "^2.1.1" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +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== + dependencies: + object-keys "^1.0.12" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +detect-libc@^1.0.2: + version "1.0.3" + 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== + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -285,15 +644,47 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + +dottie@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dottie/-/dottie-2.0.2.tgz#cc91c0726ce3a054ebf11c55fbc92a7f266dd154" + integrity sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -engine.io-client@~3.4.0: - version "3.4.4" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.4.tgz#77d8003f502b0782dd792b073a4d2cf7ca5ab967" - integrity sha512-iU4CRr38Fecj8HoZEnFtm2EiKGbYZcPn3cHxqNGl/tmdWRf60KhK+9vE0JeSjgnlS/0oynEfLgKbT9ALpim0sQ== +ejs@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b" + integrity sha512-dldq3ZfFtgVTJMLjOe+/3sROTzALlL9E34V4/sDtUd/KlBSS0s6U1/+WPE1B4sj9CXHJpL1M6rhNJnc9Wbal9w== + dependencies: + jake "^10.6.1" + +emittery@~0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +engine.io-client@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7" + integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA== dependencies: component-emitter "~1.3.0" component-inherit "0.0.3" @@ -303,7 +694,7 @@ engine.io-client@~3.4.0: indexof "0.0.1" parseqs "0.0.6" parseuri "0.0.6" - ws "~6.1.0" + ws "~7.4.2" xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" @@ -318,23 +709,106 @@ engine.io-parser@~2.2.0: blob "0.0.5" has-binary2 "~1.0.2" -engine.io@~3.4.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c" - integrity sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg== +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== dependencies: accepts "~1.3.4" base64id "2.0.0" - cookie "0.3.1" + cookie "~0.4.1" debug "~4.1.0" engine.io-parser "~2.2.0" - ws "^7.1.2" + ws "~7.4.2" 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== +es-abstract@^1.17.4: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.1.tgz#b93ddd867af16d5118e00881396533c1c6647ad9" + integrity sha512-qorBw8Y7B15DVLaJWy6WdEV/ZkieBcu6QCq/xzWzGOKJqgG1j754vXRfZ3NY7HSShneqU43mPB4OkQBTkvHhFw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.1" + has-symbols "^1.0.1" + is-arguments "^1.0.4" + is-map "^2.0.1" + is-set "^2.0.1" + is-string "^1.0.5" + isarray "^2.0.5" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + 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" @@ -345,6 +819,13 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +filelist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.1.tgz#f10d1a3ae86c1694808e8f20906f43d4c9132dbb" + integrity sha512-8zSK6Nu0DQIC08mUC46sWGXi+q3GGpKydAG36k+JDba6VRpkevvOWUW5a/PhShij4+vHT9M+ghgG7eM+a9JDUQ== + dependencies: + minimatch "^3.0.4" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -359,6 +840,25 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + fs-extra@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" @@ -369,11 +869,81 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" +fs-jetpack@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-4.0.1.tgz#1731d70bba1bd29f5979d94f2d1e0498fe4d7f85" + integrity sha512-GkDbdjAy0Qye+TGrZ12g5gxmGWg0qFz1Ujwx4pEV0Rh8hh92kZ9Nsf3Ql+wshcycq2yfnzbe68AI0pjxP8Pj0Q== + dependencies: + minimatch "^3.0.2" + rimraf "^2.6.3" + +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== +fstream@^1.0.0, fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-intrinsic@^1.0.0, get-intrinsic@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-system-fonts@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-system-fonts/-/get-system-fonts-2.0.2.tgz#7ada3cc41322daf17c204a6f07c6588341cbc9cb" + integrity sha512-zzlgaYnHMIEgHRrfC7x0Qp0Ylhw/sHpM6MHXeVBTYIsvGf5GpbnClB+Q6rAPdn+0gd2oZZIo6Tj3EaWrt4VhDQ== + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.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" @@ -381,11 +951,36 @@ glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +glob@^7.0.3, glob@^7.1.3, 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" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, 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== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +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.12.3" + har-schema "^2.0.0" + has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" @@ -398,11 +993,33 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= +has-flag@^3.0.0: + version "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-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -414,6 +1031,15 @@ http-errors@1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + i18next-fs-backend@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/i18next-fs-backend/-/i18next-fs-backend-1.0.7.tgz#00ca4587e306f8948740408389dda73461a5d07f" @@ -426,27 +1052,71 @@ i18next@^19.8.3: dependencies: "@babel/runtime" "^7.12.0" -iconv-lite@0.4.24: +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" +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +inflection@1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" + integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, 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.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -inherits@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + +ircv3@^0.26.5: + version "0.26.5" + resolved "https://registry.yarnpkg.com/ircv3/-/ircv3-0.26.5.tgz#dc1217a4e15a394d96bd321fe4960f06ffc3d7be" + integrity sha512-E5IUaNv0dphO1yGxkTe0OiMwXyRDulSL2lssv+RZc9Q/F+DzGiYrYR04c2e44DOvrsMMAv3qeaVccnOni619fw== + dependencies: + "@d-fischer/connection" "^6.2.1" + "@d-fischer/escape-string-regexp" "^5.0.0" + "@d-fischer/logger" "^2.1.1" + "@d-fischer/shared-utils" "^2.4.1" + "@d-fischer/typed-event-emitter" "^3.1.1" + "@types/node" "^14.11.2" + klona "^2.0.4" + tslib "^2.0.3" + +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== is-binary-path@~2.1.0: version "2.1.0" @@ -455,6 +1125,16 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-callable@^1.1.4, is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + is-docker@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" @@ -465,6 +1145,18 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + 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" @@ -472,6 +1164,16 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" + integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -482,6 +1184,42 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-set@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" + integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + is-wsl@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -494,11 +1232,64 @@ isarray@2.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +iterate-iterator@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" + integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== + +iterate-value@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" + integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== + dependencies: + es-get-iterator "^1.0.2" + iterate-iterator "^1.0.1" + +jake@^10.6.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" + integrity sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A== + dependencies: + async "0.9.x" + chalk "^2.4.2" + filelist "^1.0.1" + minimatch "^3.0.4" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -509,6 +1300,16 @@ json-schema-typed@^7.0.3: resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9" integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A== +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +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= + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -518,6 +1319,26 @@ jsonfile@^6.0.1: 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" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" + integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -526,6 +1347,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash@^4.17.15: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -550,7 +1376,7 @@ mime-db@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.24: +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: version "2.1.27" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== @@ -572,6 +1398,52 @@ mimic-fn@^3.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== +minimatch@^3.0.2, 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== + dependencies: + brace-expansion "^1.1.7" + +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.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: + 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: + minimist "^1.2.5" + +moment-timezone@^0.5.31: + version "0.5.32" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.32.tgz#db7677cc3cc680fd30303ebd90b0da1ca0dfecc2" + integrity sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA== + dependencies: + moment ">= 2.9.0" + +"moment@>= 2.9.0", moment@^2.26.0: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -582,20 +1454,149 @@ ms@2.1.2, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +needle@^2.2.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" + integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +node-addon-api@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.0.tgz#f9afb8d777a91525244b01775ea0ddbe1125483b" + integrity sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA== + +node-fetch@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp@3.x: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +"nopt@2 || 3": + 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.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + 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== -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +"npmlog@0 || 1 || 2 || 3 || 4", 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== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" obs-websocket-js@^4.0.2: version "4.0.2" @@ -614,6 +1615,13 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -629,6 +1637,24 @@ open@^7.3.0: is-docker "^2.0.0" is-wsl "^2.1.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= + +os-tmpdir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^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" @@ -648,25 +1674,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= - dependencies: - better-assert "~1.0.0" - parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= - dependencies: - better-assert "~1.0.0" - parseuri@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" @@ -677,6 +1689,16 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +performance-now@^2.1.0: + version "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.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" @@ -697,7 +1719,17 @@ polka@^0.5.2: "@polka/url" "^0.5.0" trouter "^2.0.1" -punycode@^2.1.0: +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== + +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== + +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== @@ -707,6 +1739,11 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + raw-body@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" @@ -717,6 +1754,29 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +readable-stream@^2.0.6: + 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" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -729,16 +1789,71 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== -safe-buffer@^5.0.1: +request@^2.87.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" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +retry-as-promised@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-3.2.0.tgz#769f63d536bec4783549db0777cb56dadd9d8543" + integrity sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg== + dependencies: + any-promise "^1.3.0" + +rimraf@2, rimraf@^2.6.1, 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" + +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== -"safer-buffer@>= 2.1.2 < 3": +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== + +"safer-buffer@>= 2.1.2 < 3", 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== +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +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@^6.0.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -749,6 +1864,40 @@ semver@^7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +sequelize-pool@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sequelize-pool/-/sequelize-pool-6.1.0.tgz#caaa0c1e324d3c2c3a399fed2c7998970925d668" + integrity sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg== + +sequelize@^6.3.5: + version "6.3.5" + resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-6.3.5.tgz#80e3db7ac8b76d98c45ca93334197eb6e2335158" + integrity sha512-MiwiPkYSA8NWttRKAXdU9h0TxP6HAc1fl7qZmMO/VQqQOND83G4nZLXd0kWILtAoT9cxtZgFqeb/MPYgEeXwsw== + dependencies: + debug "^4.1.1" + dottie "^2.0.0" + inflection "1.12.0" + lodash "^4.17.15" + moment "^2.26.0" + moment-timezone "^0.5.31" + retry-as-promised "^3.2.0" + semver "^7.3.2" + sequelize-pool "^6.0.0" + toposort-class "^1.0.1" + uuid "^8.1.0" + validator "^10.11.0" + wkx "^0.5.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= + setprototypeof@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" @@ -762,6 +1911,18 @@ sha.js@^2.4.9: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + sirv@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.7.tgz#ad8ca1f84430777a59162592626c2b8e9b9f1384" @@ -776,23 +1937,20 @@ socket.io-adapter@~1.1.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== -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== +socket.io-client@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== dependencies: backo2 "1.0.2" - base64-arraybuffer "0.1.5" component-bind "1.0.0" - component-emitter "1.2.1" - debug "~4.1.0" - engine.io-client "~3.4.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" has-binary2 "~1.0.2" - has-cors "1.1.0" indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" + parseqs "0.0.6" + parseuri "0.0.6" socket.io-parser "~3.3.0" to-array "0.1.4" @@ -814,23 +1972,124 @@ socket.io-parser@~3.4.0: debug "~4.1.0" isarray "2.0.1" -socket.io@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb" - integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg== +socket.io@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.0.tgz#01030a2727bd8eb2e85ea96d69f03692ee53d47e" + integrity sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ== dependencies: debug "~4.1.0" - engine.io "~3.4.0" + engine.io "~3.5.0" has-binary2 "~1.0.2" socket.io-adapter "~1.1.0" - socket.io-client "2.3.0" + socket.io-client "2.4.0" socket.io-parser "~3.4.0" +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= + +sqlite3@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.0.tgz#1bfef2151c6bc48a3ab1a6c126088bb8dd233566" + integrity sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw== + dependencies: + node-addon-api "2.0.0" + node-pre-gyp "^0.11.0" + optionalDependencies: + node-gyp "3.x" + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + "statuses@>= 1.5.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +string-argv@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string.prototype.trimend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +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= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -838,6 +2097,28 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + dependencies: + block-stream "*" + fstream "^1.0.12" + inherits "2" + +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -855,11 +2136,29 @@ toidentifier@1.0.0: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== +top-package@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/top-package/-/top-package-1.0.1.tgz#17990e92963bd13faa61594fd7d32568ed267a14" + integrity sha512-tsuhQlHSigOTTvonxHXwqSKEVSnWMh2GvpTvXa5YmoyOwL5YvU4lTd/KNVZlKM5v7gqx44UEuQxyPQEpmaIHdg== + +toposort-class@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" + integrity sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= + totalist@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== +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: + psl "^1.1.28" + punycode "^2.1.1" + trouter@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/trouter/-/trouter-2.0.1.tgz#2726a5f8558e090d24c3a393f09eaab1df232df6" @@ -867,6 +2166,86 @@ trouter@^2.0.1: dependencies: matchit "^1.0.0" +tslib@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +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= + +twitch-api-call@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/twitch-api-call/-/twitch-api-call-4.3.1.tgz#17586c0350cfd6e90bd402fdabfc1e65fdf4b1a5" + integrity sha512-8t0rjzKKrl2JFzp6BBJlm/UIbKAE3GpSVojo9P9gFqCcGfFI7XSZ5hHBePPn6FAtDpxJ4mXlbtRmw1apXY4Tag== + dependencies: + "@d-fischer/cross-fetch" "^4.0.2" + "@d-fischer/qs" "^7.0.2" + tslib "^2.0.3" + +twitch-auth@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/twitch-auth/-/twitch-auth-4.3.1.tgz#b7ce5f24b254e6c2a5c42839aabfcbd660356cb8" + integrity sha512-oVdhgoEF4dS1Dn4ag+9SLmQxjYArKfvLsVD/0gXxCYK4S1fStqtL7frp17LyN1E8Dy3K3zBWs7U7QTTMgdmd8w== + dependencies: + "@d-fischer/deprecate" "^2.0.2" + "@d-fischer/logger" "^2.1.1" + "@d-fischer/shared-utils" "^2.4.1" + tslib "^2.0.3" + twitch-api-call "^4.3.1" + +twitch-chat-client@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/twitch-chat-client/-/twitch-chat-client-4.3.1.tgz#04f5732431dda33a3ca5b9c903c024dcb038d3c8" + integrity sha512-ES1T7UlSmIzClXL9joUt+M3IHMCumLd58uFJNVmAo/6hmNXlzcjxKnW8mqzLlzsdpSkGoCaDksLSB607paUBLw== + dependencies: + "@d-fischer/cache-decorators" "^2.1.1" + "@d-fischer/deprecate" "^2.0.2" + "@d-fischer/logger" "^2.1.1" + "@d-fischer/shared-utils" "^2.4.1" + "@d-fischer/typed-event-emitter" "^3.1.1" + ircv3 "^0.26.5" + tslib "^2.0.3" + +twitch-pubsub-client@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/twitch-pubsub-client/-/twitch-pubsub-client-4.3.2.tgz#4db10e7e41960a808144801f47a535ea78a82767" + integrity sha512-sbI0akeuq8mE6wMW4bWsixBkTr4oXekUsR4NWEPdhkGHfJwM5byGHYvnIf8q2ravrBaK5v+W2hWhnctbw5NWAg== + dependencies: + "@d-fischer/connection" "^6.2.1" + "@d-fischer/logger" "^2.1.1" + "@d-fischer/shared-utils" "^2.4.1" + "@d-fischer/typed-event-emitter" "^3.1.1" + +twitch@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/twitch/-/twitch-4.3.1.tgz#d38b5eec350d46a3adca50adf21f65349c5a0e33" + integrity sha512-Lnqo0W18aKW1W34kIZlIDGxPLtvRJJUcS2aJqITqy7J+7GFPI9eG9e9dFZH3GKflgwa+pczPIYlao4p1Me3hvQ== + dependencies: + "@d-fischer/cache-decorators" "^2.1.1" + "@d-fischer/deprecate" "^2.0.2" + "@d-fischer/logger" "^2.1.1" + "@d-fischer/rate-limiter" "^0.2.7" + "@d-fischer/shared-utils" "^2.4.1" + top-package "^1.0.0" + tslib "^2.0.3" + twitch-api-call "^4.3.1" + twitch-auth "^4.3.1" + +type-fest@~0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.19.0.tgz#b2b8e34b2a1253a839f9c3b4bba0ebacbd34be9c" + integrity sha512-6lN0zC9ItzVv3jq9NicSaqo7PUjTNnmxGBECiJbz8Vv2TWaGW15mJTBS2BHZUlEKRsclzZzp8gHnBe4kzQRNfg== + type-is@~1.6.17: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -875,6 +2254,19 @@ type-is@~1.6.17: media-typer "0.3.0" mime-types "~2.1.24" +umzug@^3.0.0-beta.12: + version "3.0.0-beta.12" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.0.0-beta.12.tgz#f37e9381d20eb431259cf6b405ae7d25a81039f5" + integrity sha512-jlx5XsFTMBRKYRvyRSZeCbD6XYzc0goRMxh5BgHB7058MMhloMnWKxi2wOc/zGmB39TRGZImVGZdxjiuC1qxDA== + dependencies: + "@rushstack/ts-command-line" "~4.7.7" + "@types/verror" "^1.10.4" + emittery "~0.7.2" + fs-jetpack "~4.0.0" + glob "~7.1.6" + type-fest "~0.19.0" + verror "^1.10.0" + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" @@ -897,28 +2289,86 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -uuid@^8.3.1: +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.1.0, uuid@^8.3.1: version "8.3.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== -ws@^7.1.2, ws@^7.2.0: +validator@^10.11.0: + version "10.11.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228" + integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw== + +verror@1.10.0, verror@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +which@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + 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" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wkx@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.5.0.tgz#c6c37019acf40e517cc6b94657a25a3d4aa33e8c" + integrity sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== + dependencies: + "@types/node" "*" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.2.0: version "7.3.1" resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== -ws@~6.1.0: - version "6.1.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" - integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== - dependencies: - async-limiter "~1.0.0" +ws@^7.3.1: + version "7.4.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.0.tgz#a5dd76a24197940d4a8bb9e0e152bb4503764da7" + integrity sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ== + +ws@~7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" diff --git a/client-src/components/Anime/Timeline/Editor/Settings/Input.svelte b/client-src/components/Anime/Timeline/Editor/Settings/Input.svelte deleted file mode 100644 index 2a5dd79c..00000000 --- a/client-src/components/Anime/Timeline/Editor/Settings/Input.svelte +++ /dev/null @@ -1,36 +0,0 @@ - - -
-
-
{label}
- {#if removable} - - {/if} -
- -
diff --git a/client-src/components/Anime/Timeline/Editor/Settings/Panels/Info.svelte b/client-src/components/Anime/Timeline/Editor/Settings/Panels/Info.svelte deleted file mode 100644 index e5a1f607..00000000 --- a/client-src/components/Anime/Timeline/Editor/Settings/Panels/Info.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - - - {#each info as [key, value] (key)} -
-
{key}
-
{value}
-
- {/each} -
diff --git a/client-src/components/Anime/Timeline/Editor/Timeline.svelte b/client-src/components/Anime/Timeline/Editor/Timeline.svelte deleted file mode 100644 index 685452aa..00000000 --- a/client-src/components/Anime/Timeline/Editor/Timeline.svelte +++ /dev/null @@ -1,60 +0,0 @@ - - - -
- - -
-
- -
- {#each $items as item, pos (item.id)} - - {/each} - -
- -{#if fileManager} -
-
- -
-
-{/if} diff --git a/client-src/components/App/Connected.svelte b/client-src/components/App/Connected.svelte deleted file mode 100644 index e7997b57..00000000 --- a/client-src/components/App/Connected.svelte +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/client-src/components/App/LanguageSelect.svelte b/client-src/components/App/LanguageSelect.svelte deleted file mode 100644 index e7afa5ba..00000000 --- a/client-src/components/App/LanguageSelect.svelte +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - -{:else} -
- - - - - - - -
- -{#if fileManager} -
-
- -
-
-{/if} diff --git a/client-src/components/Panels/Panel/Widget/EditMode.svelte b/client-src/components/Panels/Panel/Widget/EditMode.svelte deleted file mode 100644 index 50ff558c..00000000 --- a/client-src/components/Panels/Panel/Widget/EditMode.svelte +++ /dev/null @@ -1,62 +0,0 @@ - - -
- - - - - -{#if editModal} - -{/if} diff --git a/client-src/components/Panels/Panel/Widget/RemoveCross.svelte b/client-src/components/Panels/Panel/Widget/RemoveCross.svelte deleted file mode 100644 index 6fb88641..00000000 --- a/client-src/components/Panels/Panel/Widget/RemoveCross.svelte +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/client-src/components/Panels/Topbar.svelte b/client-src/components/Panels/Topbar.svelte deleted file mode 100644 index 5551dbbf..00000000 --- a/client-src/components/Panels/Topbar.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/client-src/components/Panels/Topbar/Selector.svelte b/client-src/components/Panels/Topbar/Selector.svelte deleted file mode 100644 index 9a08d4a8..00000000 --- a/client-src/components/Panels/Topbar/Selector.svelte +++ /dev/null @@ -1,57 +0,0 @@ - - -
- - {/each} - - {:else} -
{_('sentences.no-panels-found')}
- {/if} -
diff --git a/client-src/components/Panels/Topbar/Settings.svelte b/client-src/components/Panels/Topbar/Settings.svelte deleted file mode 100644 index f12cbec8..00000000 --- a/client-src/components/Panels/Topbar/Settings.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - -{#if $editMode && $currentPanel} -
- - - -
-{/if} diff --git a/client-src/components/Panels/Topbar/Settings/AddButton.svelte b/client-src/components/Panels/Topbar/Settings/AddButton.svelte deleted file mode 100644 index 8f88a33f..00000000 --- a/client-src/components/Panels/Topbar/Settings/AddButton.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/client-src/components/Panels/Topbar/Settings/RemoveButton.svelte b/client-src/components/Panels/Topbar/Settings/RemoveButton.svelte deleted file mode 100644 index 7d967a24..00000000 --- a/client-src/components/Panels/Topbar/Settings/RemoveButton.svelte +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/client-src/components/Panels/Topbar/Settings/RenameInput.svelte b/client-src/components/Panels/Topbar/Settings/RenameInput.svelte deleted file mode 100644 index 0e356e56..00000000 --- a/client-src/components/Panels/Topbar/Settings/RenameInput.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/client-src/components/UI/ConfirmModal.svelte b/client-src/components/UI/ConfirmModal.svelte deleted file mode 100644 index fc7f97a3..00000000 --- a/client-src/components/UI/ConfirmModal.svelte +++ /dev/null @@ -1,32 +0,0 @@ - - -{#if visible} - -
{question}
- -
- - -
-
-{/if} diff --git a/client-src/components/UI/FullScreenModal.svelte b/client-src/components/UI/FullScreenModal.svelte deleted file mode 100644 index 74e94d70..00000000 --- a/client-src/components/UI/FullScreenModal.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - -
- -
diff --git a/client-src/components/UI/Modal.svelte b/client-src/components/UI/Modal.svelte deleted file mode 100644 index 71f4b3e9..00000000 --- a/client-src/components/UI/Modal.svelte +++ /dev/null @@ -1,42 +0,0 @@ - - -
-
-
- {#if closable} -
- -
- {/if} - -
-
-
diff --git a/client-src/components/Widgets/Anime/Timeline/Settings.svelte b/client-src/components/Widgets/Anime/Timeline/Settings.svelte deleted file mode 100644 index c1e125e9..00000000 --- a/client-src/components/Widgets/Anime/Timeline/Settings.svelte +++ /dev/null @@ -1,47 +0,0 @@ - - - - -{#if timelineOpened} - - - -{/if} diff --git a/client-src/components/Widgets/WidgetWrapper.svelte b/client-src/components/Widgets/WidgetWrapper.svelte deleted file mode 100644 index 0bc503dd..00000000 --- a/client-src/components/Widgets/WidgetWrapper.svelte +++ /dev/null @@ -1,44 +0,0 @@ - - -
-
- -{#if inQueue} - {#if running} -
-
- -
-
- {/if} -
-
-
- {inQueue} -
-
-
-{/if} diff --git a/client-src/components/Widgets/index.js b/client-src/components/Widgets/index.js deleted file mode 100644 index 767e4ec4..00000000 --- a/client-src/components/Widgets/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import * as SceneList from "./OBS/SceneList"; -import * as GoToScene from "./OBS/GoToScene"; -import * as ToggleScene from "./OBS/ToggleScene"; -import * as AnimeTimeline from "./Anime/Timeline"; - -const widgets = { - SceneList, - GoToScene, - ToggleScene, - AnimeTimeline, -}; - -export default widgets; diff --git a/client-src/libs/actions.js b/client-src/libs/actions.js deleted file mode 100644 index 4aa0cefe..00000000 --- a/client-src/libs/actions.js +++ /dev/null @@ -1,23 +0,0 @@ -import api from "@/api/actions"; - -function push(action) { - return api.push(action); -} - -function on(eventName, cb) { - return api.on(eventName, cb); -} - -function update(anime) { - return api.update(anime); -} - -function get(id) { - return api.get(id); -} - -function getState() { - return api.getState(); -} - -export { push, on, update, get, getState }; diff --git a/client-src/libs/panels.js b/client-src/libs/panels.js deleted file mode 100644 index 10480b44..00000000 --- a/client-src/libs/panels.js +++ /dev/null @@ -1,11 +0,0 @@ -import api from "@/api/panels"; - -function updateReducer({ id, x, y, w, h }) { - return { id, x, y, w, h }; -} - -function update(panel) { - return api.update({ ...panel, grid: panel.grid.map(updateReducer) }); -} - -export { update }; diff --git a/client-src/libs/socket.io.js b/client-src/libs/socket.io.js deleted file mode 100644 index 394f0252..00000000 --- a/client-src/libs/socket.io.js +++ /dev/null @@ -1,39 +0,0 @@ -import client from "socket.io-client"; - -const defaultOptions = { - transports: ["websocket"], - upgrade: false, -}; - -let socket = null; - -function io(options = {}) { - if (!socket) { - socket = client({ ...defaultOptions, ...options }); - } - - return socket; -} - -function on(...args) { - if (!socket) { - throw new Error("socket.io: Not connected"); - } - - socket.on(...args); -} - -function emit(...args) { - return new Promise((resolve, reject) => { - if (!socket) { - return reject(new Error("socket.io: Not connected")); - } - - socket.emit(...args, ({ payload, error }) => { - error ? reject(error) : resolve(payload); - }); - }); -} - -export default io; -export { socket, on, emit }; diff --git a/client-src/stores/app.js b/client-src/stores/app.js deleted file mode 100644 index ed99073f..00000000 --- a/client-src/stores/app.js +++ /dev/null @@ -1,9 +0,0 @@ -import { writable } from "svelte/store"; -import { emit } from "@/libs/socket.io"; - -export const store = writable(null); -export const initialized = writable(false); - -export default async function load() { - store.set(await emit("stores.app", "getAll")); -} diff --git a/docs/images/screenshot.png b/docs/images/screenshot.png new file mode 100644 index 00000000..5af360a2 Binary files /dev/null and b/docs/images/screenshot.png differ diff --git a/client-src/api/actions.js b/front-src/client/api/actions.js similarity index 100% rename from client-src/api/actions.js rename to front-src/client/api/actions.js diff --git a/front-src/client/api/app.js b/front-src/client/api/app.js new file mode 100644 index 00000000..af0ce52d --- /dev/null +++ b/front-src/client/api/app.js @@ -0,0 +1,11 @@ +import { emit } from "@/libs/socket.io"; + +export default { + quit: () => emit("app.quit"), + getOS: () => emit("app.getOS"), + getFonts: () => emit("app.getFonts"), + loadFont: (url) => emit("app.loadFont", url), + getUsedFonts: () => emit("app.getUsedFonts"), + getSettings: () => emit("app.getSettings"), + setSetting: (key, value) => emit("app.setSetting", key, value), +}; diff --git a/front-src/client/api/command.js b/front-src/client/api/command.js new file mode 100644 index 00000000..23a9d98d --- /dev/null +++ b/front-src/client/api/command.js @@ -0,0 +1,6 @@ +import { emit } from "@/libs/socket.io"; + +export default { + getSettings: () => emit("command.getSettings"), + setPrefix: (prefix) => emit("command.setPrefix", prefix), +}; diff --git a/client-src/api/files.js b/front-src/client/api/files.js similarity index 82% rename from client-src/api/files.js rename to front-src/client/api/files.js index b1eb6137..b4b40a4c 100644 --- a/client-src/api/files.js +++ b/front-src/client/api/files.js @@ -1,8 +1,9 @@ import { emit, on } from "@/libs/socket.io"; export default { + getFileList: () => emit("files.getFileList"), upload: (file) => emit("files.upload", file), remove: (file) => emit("files.remove", file), - getFileList: () => emit("files.getFileList"), + update: (file, data) => emit("files.update", file, data), on: (eventName, callback) => on(`files.${eventName}`, callback), }; diff --git a/front-src/client/api/i18next.js b/front-src/client/api/i18next.js new file mode 100644 index 00000000..9e5e502b --- /dev/null +++ b/front-src/client/api/i18next.js @@ -0,0 +1,6 @@ +import { emit } from "@/libs/socket.io"; + +export default { + getConfig: () => emit("i18next.getConfig"), + changeLanguage: (language) => emit("i18next.changeLanguage", language), +}; diff --git a/client-src/api/obs.js b/front-src/client/api/obs.js similarity index 72% rename from client-src/api/obs.js rename to front-src/client/api/obs.js index 08b41480..b994659c 100644 --- a/client-src/api/obs.js +++ b/front-src/client/api/obs.js @@ -4,8 +4,8 @@ export default { connect: () => emit("obs.connect"), disconnect: () => emit("obs.disconnect"), getState: () => emit("obs.getState"), - getStore: () => emit("stores.obs", "getAll"), emit: (...args) => emit("obs.emit", ...args), - set: (key, val) => emit("stores.obs", "set", key, val), + getSettings: () => emit("obs.getSettings"), + setSetting: (key, value) => emit("obs.setSetting", key, value), on: (eventName, callback) => on(`obs.${eventName}`, callback), }; diff --git a/front-src/client/api/overlay.js b/front-src/client/api/overlay.js new file mode 100644 index 00000000..4f74dc7d --- /dev/null +++ b/front-src/client/api/overlay.js @@ -0,0 +1,6 @@ +import { emit, on } from "@/libs/socket.io"; + +export default { + isConnected: () => emit("overlay.isConnected"), + on: (eventName, callback) => on(`overlay.${eventName}`, callback), +}; diff --git a/client-src/api/panels.js b/front-src/client/api/panels.js similarity index 55% rename from client-src/api/panels.js rename to front-src/client/api/panels.js index 37022053..30532f35 100644 --- a/client-src/api/panels.js +++ b/front-src/client/api/panels.js @@ -2,10 +2,15 @@ import { on, emit } from "@/libs/socket.io"; export default { add: () => emit("panels.add"), + getStore: () => emit("panels.getAll"), + set: (panels) => emit("panels.set", panels), remove: (panel) => emit("panels.remove", panel), update: (panel) => emit("panels.update", panel), - getStore: () => emit("stores.panels", "getAll"), on: (eventName, callback) => on(`panels.${eventName}`, callback), addWidget: (panel, item) => emit("panels.addWidget", panel, item), + duplicateWidget: (payload) => emit("panels.duplicateWidget", payload), + moveWidgetToPanel: (payload) => emit("panels.moveWidgetToPanel", payload), removeWidget: (panel, widget) => emit("panels.removeWidget", panel, widget), + removeWidgetComponent: (panel, widget) => + emit("panels.removeWidgetComponent", panel, widget), }; diff --git a/front-src/client/api/twitch.js b/front-src/client/api/twitch.js new file mode 100644 index 00000000..498b2829 --- /dev/null +++ b/front-src/client/api/twitch.js @@ -0,0 +1,20 @@ +import { emit, on } from "@/libs/socket.io"; + +export default { + getState: () => emit("twitch.getState"), + getEventNames: () => emit("twitch.getEventNames"), + getRewardList: () => emit("twitch.getRewardList"), + getCommandList: () => emit("twitch.getCommandList"), + getCommandNames: () => emit("twitch.getCommandNames"), + getCommandPrefix: () => emit("twitch.getCommandPrefix"), + getLastFollowers: () => emit("twitch.getLastFollowers"), + addCommand: (command) => emit("twitch.addCommand", command), + updateReward: (reward) => emit("twitch.updateReward", reward), + updateCommand: (command) => emit("twitch.updateCommand", command), + removeCommand: (command) => emit("twitch.removeCommand", command), + updateState: (state) => emit("twitch.updateState", state), + login: (email = false) => emit("twitch.login", email), + on: (eventName, callback) => on(`twitch.${eventName}`, callback), + setSetting: (key, value) => emit("twitch.setSetting", key, value), + getSettings: () => emit("twitch.getSettings"), +}; diff --git a/front-src/client/assets/images/Twitch_icon.svg b/front-src/client/assets/images/Twitch_icon.svg new file mode 100644 index 00000000..e016fb19 --- /dev/null +++ b/front-src/client/assets/images/Twitch_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/front-src/client/assets/images/Twitch_logo.svg b/front-src/client/assets/images/Twitch_logo.svg new file mode 100644 index 00000000..6adeb861 --- /dev/null +++ b/front-src/client/assets/images/Twitch_logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/front-src/client/assets/images/Twitch_text.svg b/front-src/client/assets/images/Twitch_text.svg new file mode 100644 index 00000000..d70a9e0b --- /dev/null +++ b/front-src/client/assets/images/Twitch_text.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/client-src/assets/images/marv.svg b/front-src/client/assets/images/marv.svg similarity index 100% rename from client-src/assets/images/marv.svg rename to front-src/client/assets/images/marv.svg diff --git a/client-src/components/Anime/Timeline/Editor.svelte b/front-src/client/components/Anime/Timeline/Editor.svelte similarity index 80% rename from client-src/components/Anime/Timeline/Editor.svelte rename to front-src/client/components/Anime/Timeline/Editor.svelte index ec8e6728..73e3d577 100644 --- a/client-src/components/Anime/Timeline/Editor.svelte +++ b/front-src/client/components/Anime/Timeline/Editor.svelte @@ -1,4 +1,5 @@ @@ -121,7 +131,7 @@
- +
@@ -130,6 +140,11 @@
- +
diff --git a/client-src/components/Anime/Timeline/Editor/AnimeIcon.svelte b/front-src/client/components/Anime/Timeline/Editor/AnimeIcon.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/AnimeIcon.svelte rename to front-src/client/components/Anime/Timeline/Editor/AnimeIcon.svelte diff --git a/front-src/client/components/Anime/Timeline/Editor/InsertTextModal.svelte b/front-src/client/components/Anime/Timeline/Editor/InsertTextModal.svelte new file mode 100644 index 00000000..93482359 --- /dev/null +++ b/front-src/client/components/Anime/Timeline/Editor/InsertTextModal.svelte @@ -0,0 +1,48 @@ + + + + {#if notify} + + {/if} +
+ +
+
+ + +
+
diff --git a/client-src/components/Anime/Timeline/Editor/Layout.svelte b/front-src/client/components/Anime/Timeline/Editor/Layout.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Layout.svelte rename to front-src/client/components/Anime/Timeline/Editor/Layout.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Settings.svelte b/front-src/client/components/Anime/Timeline/Editor/Settings.svelte similarity index 90% rename from client-src/components/Anime/Timeline/Editor/Settings.svelte rename to front-src/client/components/Anime/Timeline/Editor/Settings.svelte index 9f7fc123..69007638 100644 --- a/client-src/components/Anime/Timeline/Editor/Settings.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Settings.svelte @@ -1,4 +1,5 @@ + +
+
+
{label}
+ {#if removable} + + {/if} +
+ {#if type === 'colorpicker'} + + {:else if type === 'fontpicker'} + + {:else if type === 'select'} + + {/if} +
diff --git a/client-src/components/Anime/Timeline/Editor/Settings/Keyframe.svelte b/front-src/client/components/Anime/Timeline/Editor/Settings/Keyframe.svelte similarity index 88% rename from client-src/components/Anime/Timeline/Editor/Settings/Keyframe.svelte rename to front-src/client/components/Anime/Timeline/Editor/Settings/Keyframe.svelte index c58e8953..f599fd13 100644 --- a/client-src/components/Anime/Timeline/Editor/Settings/Keyframe.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Settings/Keyframe.svelte @@ -47,10 +47,10 @@ {#if $selectedKeyframe} - + -
+
+
+
{_('words.easing')}
+
+ import { _ } from "@/libs/i18next"; + import Panel from "../Panel.svelte"; + + export let info; + + function humanLabel(label) { + return _(`labels.${label}`); + } + + + + {#each info as [key, value] (key)} +
+
{humanLabel(key)}
+
{value}
+
+ {/each} +
diff --git a/client-src/components/Anime/Timeline/Editor/Settings/Panels/Style.svelte b/front-src/client/components/Anime/Timeline/Editor/Settings/Panels/Style.svelte similarity index 66% rename from client-src/components/Anime/Timeline/Editor/Settings/Panels/Style.svelte rename to front-src/client/components/Anime/Timeline/Editor/Settings/Panels/Style.svelte index 7f43f755..b225999a 100644 --- a/client-src/components/Anime/Timeline/Editor/Settings/Panels/Style.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Settings/Panels/Style.svelte @@ -1,4 +1,5 @@ - + {#if styleNames.length}
{#if visible} -
+
- +
diff --git a/front-src/client/components/Anime/Timeline/Editor/Settings/TextShadow.svelte b/front-src/client/components/Anime/Timeline/Editor/Settings/TextShadow.svelte new file mode 100644 index 00000000..007ab03e --- /dev/null +++ b/front-src/client/components/Anime/Timeline/Editor/Settings/TextShadow.svelte @@ -0,0 +1,56 @@ + + +
+ + + + + +
diff --git a/front-src/client/components/Anime/Timeline/Editor/Timeline.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline.svelte new file mode 100644 index 00000000..3a5df133 --- /dev/null +++ b/front-src/client/components/Anime/Timeline/Editor/Timeline.svelte @@ -0,0 +1,121 @@ + + + +
+ + + + +
+
+ +
+
+
+ +
+ {#each $items as item, pos (item.id)} + + {/each} + +
+ + + + diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Cursor.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Cursor.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Timeline/Cursor.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Cursor.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Grid.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Grid.svelte similarity index 54% rename from client-src/components/Anime/Timeline/Editor/Timeline/Grid.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Grid.svelte index 4252146a..df60a1f5 100644 --- a/client-src/components/Anime/Timeline/Editor/Timeline/Grid.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Timeline/Grid.svelte @@ -16,39 +16,41 @@
-
- +
+
-
+
-
+ >
diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Item.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Item.svelte similarity index 78% rename from client-src/components/Anime/Timeline/Editor/Timeline/Item.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Item.svelte index e680fa6b..df328712 100644 --- a/client-src/components/Anime/Timeline/Editor/Timeline/Item.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Timeline/Item.svelte @@ -1,20 +1,27 @@
{item.target.filename}
-
+ {#if item.target.type === 'text'} +
+ +
+ {/if} +
{#if isDragOver} @@ -151,3 +167,11 @@ /> {/each} + + diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Keyframe.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Keyframe.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Timeline/Keyframe.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Keyframe.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Keyframes.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Keyframes.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Timeline/Keyframes.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Keyframes.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Player.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Player.svelte similarity index 98% rename from client-src/components/Anime/Timeline/Editor/Timeline/Player.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Player.svelte index 3b40d52e..05621e11 100644 --- a/client-src/components/Anime/Timeline/Editor/Timeline/Player.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Timeline/Player.svelte @@ -30,7 +30,7 @@ } function resetAnime() { - $seek = 0; + seek.set(0); $paused = true; anime && anime.reset(); } diff --git a/client-src/components/Anime/Timeline/Editor/Timeline/Ruler.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/Ruler.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Timeline/Ruler.svelte rename to front-src/client/components/Anime/Timeline/Editor/Timeline/Ruler.svelte diff --git a/front-src/client/components/Anime/Timeline/Editor/Timeline/TagList.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/TagList.svelte new file mode 100644 index 00000000..24e775da --- /dev/null +++ b/front-src/client/components/Anime/Timeline/Editor/Timeline/TagList.svelte @@ -0,0 +1,19 @@ + + +
+ {#each tags as tag} +
${tag}
+ {/each} +
diff --git a/front-src/client/components/Anime/Timeline/Editor/Timeline/TextEditorModal.svelte b/front-src/client/components/Anime/Timeline/Editor/Timeline/TextEditorModal.svelte new file mode 100644 index 00000000..8eda11a6 --- /dev/null +++ b/front-src/client/components/Anime/Timeline/Editor/Timeline/TextEditorModal.svelte @@ -0,0 +1,40 @@ + + + + +
+ {#await fetchText(item.target.filename)} + Loading.... + {:then text} + + {/await} +
+
+ +
+
diff --git a/client-src/components/Anime/Timeline/Editor/Viewer.svelte b/front-src/client/components/Anime/Timeline/Editor/Viewer.svelte similarity index 76% rename from client-src/components/Anime/Timeline/Editor/Viewer.svelte rename to front-src/client/components/Anime/Timeline/Editor/Viewer.svelte index 4135d531..6f1a7208 100644 --- a/client-src/components/Anime/Timeline/Editor/Viewer.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Viewer.svelte @@ -1,10 +1,16 @@
+
+ +
- width + {_('words.width')}
- height + {_('words.height')} -
+
diff --git a/client-src/components/Anime/Timeline/Editor/Viewer/Items.svelte b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items.svelte similarity index 70% rename from client-src/components/Anime/Timeline/Editor/Viewer/Items.svelte rename to front-src/client/components/Anime/Timeline/Editor/Viewer/Items.svelte index 96efb661..5741c60f 100644 --- a/client-src/components/Anime/Timeline/Editor/Viewer/Items.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items.svelte @@ -6,5 +6,5 @@ {#each $items as item (item.id)} - + {/each} diff --git a/client-src/components/Anime/Timeline/Editor/Viewer/Items/Audio.svelte b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Audio.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Viewer/Items/Audio.svelte rename to front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Audio.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Viewer/Items/Image.svelte b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Image.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Viewer/Items/Image.svelte rename to front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Image.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Viewer/Items/Text.svelte b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Text.svelte similarity index 62% rename from client-src/components/Anime/Timeline/Editor/Viewer/Items/Text.svelte rename to front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Text.svelte index 1a5e181b..55d5ac36 100644 --- a/client-src/components/Anime/Timeline/Editor/Viewer/Items/Text.svelte +++ b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Text.svelte @@ -13,4 +13,10 @@ $: fetchText(item.target.filename).then((txt) => (text = txt)); -
{text}
+
+ {text} +
diff --git a/client-src/components/Anime/Timeline/Editor/Viewer/Items/Video.svelte b/front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Video.svelte similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Viewer/Items/Video.svelte rename to front-src/client/components/Anime/Timeline/Editor/Viewer/Items/Video.svelte diff --git a/client-src/components/Anime/Timeline/Editor/Viewer/items.js b/front-src/client/components/Anime/Timeline/Editor/Viewer/items.js similarity index 100% rename from client-src/components/Anime/Timeline/Editor/Viewer/items.js rename to front-src/client/components/Anime/Timeline/Editor/Viewer/items.js diff --git a/client-src/components/Anime/Timeline/libs/createAnimeFromFile.js b/front-src/client/components/Anime/Timeline/libs/createAnimeFromFile.js similarity index 88% rename from client-src/components/Anime/Timeline/libs/createAnimeFromFile.js rename to front-src/client/components/Anime/Timeline/libs/createAnimeFromFile.js index 5e9c027d..d6f21f45 100644 --- a/client-src/components/Anime/Timeline/libs/createAnimeFromFile.js +++ b/front-src/client/components/Anime/Timeline/libs/createAnimeFromFile.js @@ -1,5 +1,6 @@ import { v4 as uuid } from "uuid"; import { elementFactories } from "./utils"; +import { createKeyframe } from "./createKeyframe"; import { defaultStyles, @@ -76,10 +77,13 @@ async function createTargetFromFile(file) { } export default async function createAnimeFromFile(file) { + const target = await createTargetFromFile(file); + const { duration } = target.info; + const props = duration === undefined ? {} : { duration }; return { id: uuid(), type: "file", - target: await createTargetFromFile(file), - keyframes: [], + target, + keyframes: [createKeyframe(props)], }; } diff --git a/front-src/client/components/Anime/Timeline/libs/createKeyframe.js b/front-src/client/components/Anime/Timeline/libs/createKeyframe.js new file mode 100644 index 00000000..676d363f --- /dev/null +++ b/front-src/client/components/Anime/Timeline/libs/createKeyframe.js @@ -0,0 +1,14 @@ +import { v4 as uuid } from "uuid"; + +export function createKeyframe(props = {}) { + return { + id: uuid(), + delay: 0, + duration: 1000, + easing: "linear", + ...props, + attrs: {}, + style: {}, + trans: {}, + }; +} diff --git a/client-src/components/Anime/Timeline/libs/getAttrs.js b/front-src/client/components/Anime/Timeline/libs/getAttrs.js similarity index 100% rename from client-src/components/Anime/Timeline/libs/getAttrs.js rename to front-src/client/components/Anime/Timeline/libs/getAttrs.js diff --git a/client-src/components/Anime/Timeline/libs/getStyle.js b/front-src/client/components/Anime/Timeline/libs/getStyle.js similarity index 69% rename from client-src/components/Anime/Timeline/libs/getStyle.js rename to front-src/client/components/Anime/Timeline/libs/getStyle.js index 0c728ea0..09bacf9f 100644 --- a/client-src/components/Anime/Timeline/libs/getStyle.js +++ b/front-src/client/components/Anime/Timeline/libs/getStyle.js @@ -5,11 +5,17 @@ function getUnit(key) { return defs ? defs.unit || "" : ""; } +function parseType(key, value) { + const defs = styleDefs[key]; + return defs && defs.type === "string" ? `'${value}'` : value; +} + export default function getStyle(input) { const style = ["max-width:none"]; Object.entries(input).forEach(([key, value]) => { const unit = getUnit(key); + value = parseType(key, value); style.push(`${key}:${value}${unit}`); }); diff --git a/client-src/components/Anime/Timeline/libs/getTrans.js b/front-src/client/components/Anime/Timeline/libs/getTrans.js similarity index 100% rename from client-src/components/Anime/Timeline/libs/getTrans.js rename to front-src/client/components/Anime/Timeline/libs/getTrans.js diff --git a/client-src/components/Anime/Timeline/libs/settings.js b/front-src/client/components/Anime/Timeline/libs/settings.js similarity index 83% rename from client-src/components/Anime/Timeline/libs/settings.js rename to front-src/client/components/Anime/Timeline/libs/settings.js index c1709809..5007b0ce 100644 --- a/client-src/components/Anime/Timeline/libs/settings.js +++ b/front-src/client/components/Anime/Timeline/libs/settings.js @@ -11,9 +11,13 @@ export const defaultStyles = { "font-size", "font-family", "font-weight", + "text-align", "color", "opacity", "z-index", + "text-shadow", + "-webkit-text-stroke-width", + "-webkit-text-stroke-color", ], image: ["top", "left", "width", "height", "opacity", "z-index"], video: ["top", "left", "width", "height", "opacity", "z-index"], @@ -62,7 +66,7 @@ export const styleDefs = { input: { type: "number", min: 1, step: 1 }, }, "font-size": { - default: 42, + default: 72, unit: "px", input: { type: "number", min: 0, step: 10 }, }, @@ -71,12 +75,30 @@ export const styleDefs = { input: { type: "number", min: 100, max: 900, step: 100 }, }, "font-family": { - default: "monospace", - input: { type: "text" }, + type: "string", + default: "", + input: { type: "fontpicker" }, + }, + "text-align": { + default: "center", + input: { type: "select", items: ["left", "center", "right"] }, + }, + "-webkit-text-stroke-width": { + default: 1, + unit: "px", + input: { type: "number", min: 0, step: 1 }, + }, + "-webkit-text-stroke-color": { + default: "#111111", + input: { type: "colorpicker" }, + }, + "text-shadow": { + default: "2px 2px 0 #111111", + input: { type: "textshadow" }, }, color: { - default: "#420042", - input: { type: "text" }, + default: "#eeeeee", + input: { type: "colorpicker" }, }, }; diff --git a/client-src/components/Anime/Timeline/libs/store.js b/front-src/client/components/Anime/Timeline/libs/store.js similarity index 100% rename from client-src/components/Anime/Timeline/libs/store.js rename to front-src/client/components/Anime/Timeline/libs/store.js diff --git a/client-src/components/Anime/Timeline/libs/utils.js b/front-src/client/components/Anime/Timeline/libs/utils.js similarity index 93% rename from client-src/components/Anime/Timeline/libs/utils.js rename to front-src/client/components/Anime/Timeline/libs/utils.js index e2a2bd1e..3b08403c 100644 --- a/client-src/components/Anime/Timeline/libs/utils.js +++ b/front-src/client/components/Anime/Timeline/libs/utils.js @@ -3,7 +3,7 @@ const mediaPath = "/files"; export function createImage(src) { return new Promise((resolve, reject) => { const img = new Image(); - img.onerror = reject; + img.onerror = () => reject(new Error(`Invalid image ${src}`)); img.onload = () => resolve(img); img.src = `${mediaPath}/${src}`; }); diff --git a/client-src/components/App.svelte b/front-src/client/components/App.svelte similarity index 74% rename from client-src/components/App.svelte rename to front-src/client/components/App.svelte index 428aadda..3df9be7c 100644 --- a/client-src/components/App.svelte +++ b/front-src/client/components/App.svelte @@ -1,31 +1,38 @@
+
+ + diff --git a/front-src/client/components/App/CheckUpdate.svelte b/front-src/client/components/App/CheckUpdate.svelte new file mode 100644 index 00000000..636afcad --- /dev/null +++ b/front-src/client/components/App/CheckUpdate.svelte @@ -0,0 +1,41 @@ + + + +
+ +
+
+ +
+
diff --git a/front-src/client/components/App/CheckUpdateCheckbox.svelte b/front-src/client/components/App/CheckUpdateCheckbox.svelte new file mode 100644 index 00000000..54db59ba --- /dev/null +++ b/front-src/client/components/App/CheckUpdateCheckbox.svelte @@ -0,0 +1,17 @@ + + + diff --git a/front-src/client/components/App/Connected.svelte b/front-src/client/components/App/Connected.svelte new file mode 100644 index 00000000..f5430059 --- /dev/null +++ b/front-src/client/components/App/Connected.svelte @@ -0,0 +1,27 @@ + + + + + + + diff --git a/client-src/components/App/Connecting.svelte b/front-src/client/components/App/Connecting.svelte similarity index 68% rename from client-src/components/App/Connecting.svelte rename to front-src/client/components/App/Connecting.svelte index a9acd84e..51ea447a 100644 --- a/client-src/components/App/Connecting.svelte +++ b/front-src/client/components/App/Connecting.svelte @@ -1,13 +1,12 @@ diff --git a/front-src/client/components/App/ContextMenu.svelte b/front-src/client/components/App/ContextMenu.svelte new file mode 100644 index 00000000..64ddecad --- /dev/null +++ b/front-src/client/components/App/ContextMenu.svelte @@ -0,0 +1,25 @@ + + + + +
+ + + + + + +
+
diff --git a/front-src/client/components/App/ContextMenu/AddPanelItem.svelte b/front-src/client/components/App/ContextMenu/AddPanelItem.svelte new file mode 100644 index 00000000..2280f5df --- /dev/null +++ b/front-src/client/components/App/ContextMenu/AddPanelItem.svelte @@ -0,0 +1,16 @@ + + + + {_('sentences.add-panel')} + diff --git a/front-src/client/components/App/ContextMenu/AddWidgetItem.svelte b/front-src/client/components/App/ContextMenu/AddWidgetItem.svelte new file mode 100644 index 00000000..f789511e --- /dev/null +++ b/front-src/client/components/App/ContextMenu/AddWidgetItem.svelte @@ -0,0 +1,12 @@ + + +{#if $currentPanel} + + {_('sentences.add-grid-widget')} + +{/if} diff --git a/front-src/client/components/App/ContextMenu/EditGridItem.svelte b/front-src/client/components/App/ContextMenu/EditGridItem.svelte new file mode 100644 index 00000000..3bf6f5db --- /dev/null +++ b/front-src/client/components/App/ContextMenu/EditGridItem.svelte @@ -0,0 +1,18 @@ + + +{#if $currentPanel && $currentPanel.widgets.length} + + {capitalize(editModeLabel)} + +{/if} diff --git a/client-src/components/App/Disconnected.svelte b/front-src/client/components/App/Disconnected.svelte similarity index 100% rename from client-src/components/App/Disconnected.svelte rename to front-src/client/components/App/Disconnected.svelte diff --git a/front-src/client/components/App/Donate.svelte b/front-src/client/components/App/Donate.svelte new file mode 100644 index 00000000..ce90d6b0 --- /dev/null +++ b/front-src/client/components/App/Donate.svelte @@ -0,0 +1,33 @@ + + +
+
+ +
+
{_('words.donate')}
+
+ + diff --git a/front-src/client/components/App/ElectronTopbar.svelte b/front-src/client/components/App/ElectronTopbar.svelte new file mode 100644 index 00000000..6d71b251 --- /dev/null +++ b/front-src/client/components/App/ElectronTopbar.svelte @@ -0,0 +1,29 @@ + + + + +{#if electron} +
+
+ +
+
{fingerprint}
+
+ ✕ +
+
+{/if} diff --git a/front-src/client/components/App/FirstStart.svelte b/front-src/client/components/App/FirstStart.svelte new file mode 100644 index 00000000..8f49d63e --- /dev/null +++ b/front-src/client/components/App/FirstStart.svelte @@ -0,0 +1,57 @@ + + + +
+
+
{_('obs.overlay-install-sentence')}
+
+
{overlayURL}
+
+
- {_('obs.check-disable-source-not-visible')}
+
- {_('obs.check-refresh-browser-on-activate')}
+
+
+
{_('obs.first-start-install-sentence')}
+
+ {#await getURL()} + {_('words.loading')}... + {:then url} + {_('words.download')} + {:catch error} + {_('words.error')}: + {error.message} + {/await} +
+
+ +
+
diff --git a/front-src/client/components/App/HelpLinks.svelte b/front-src/client/components/App/HelpLinks.svelte new file mode 100644 index 00000000..fd03c3b7 --- /dev/null +++ b/front-src/client/components/App/HelpLinks.svelte @@ -0,0 +1,16 @@ + + +
+
+ +
+
{_('words.help')}
+
+ + diff --git a/front-src/client/components/App/LanguageSelect.svelte b/front-src/client/components/App/LanguageSelect.svelte new file mode 100644 index 00000000..3efc4f3d --- /dev/null +++ b/front-src/client/components/App/LanguageSelect.svelte @@ -0,0 +1,25 @@ + + +
+
+ +
+
{_('words.language')}
+ + {/if} + {#if config.hasEvent} + + {/if} + {#if widget.eventName === 'onRedemption'} + +
+{/if} + + diff --git a/front-src/client/components/Panels/Panel/Widget/Edit/Styles.svelte b/front-src/client/components/Panels/Panel/Widget/Edit/Styles.svelte new file mode 100644 index 00000000..dc0b8017 --- /dev/null +++ b/front-src/client/components/Panels/Panel/Widget/Edit/Styles.svelte @@ -0,0 +1,216 @@ + + +
+ + + + +
+ + +
+
+ {#each bordersTags as tag} +
+
{formatTag(tag)}
+ +
+ {/each} +
+ + +
+ + diff --git a/front-src/client/components/Panels/Panel/Widget/Edit/borders.js b/front-src/client/components/Panels/Panel/Widget/Edit/borders.js new file mode 100644 index 00000000..53428238 --- /dev/null +++ b/front-src/client/components/Panels/Panel/Widget/Edit/borders.js @@ -0,0 +1,22 @@ +module.exports = { + positions: [ + { key: "all", val: "" }, + { key: "top", val: "t" }, + { key: "left", val: "l" }, + { key: "right", val: "r" }, + { key: "bottom", val: "b" }, + { key: "top left", val: "tl" }, + { key: "top right", val: "tr" }, + { key: "bottom left", val: "bl" }, + { key: "bottom right", val: "br" }, + ], + sizes: [ + { key: "2px", val: "sm" }, + { key: "4px", val: "" }, + { key: "8px", val: "md" }, + { key: "16px", val: "lg" }, + { key: "42px", val: "xl" }, + { key: "50%", val: "half" }, + { key: "100%", val: "full" }, + ], +}; diff --git a/front-src/client/components/Panels/Panel/Widget/EditActionModal.svelte b/front-src/client/components/Panels/Panel/Widget/EditActionModal.svelte new file mode 100644 index 00000000..c1bf500c --- /dev/null +++ b/front-src/client/components/Panels/Panel/Widget/EditActionModal.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/front-src/client/components/Panels/Panel/Widget/EditStylesModal.svelte b/front-src/client/components/Panels/Panel/Widget/EditStylesModal.svelte new file mode 100644 index 00000000..5b1daf72 --- /dev/null +++ b/front-src/client/components/Panels/Panel/Widget/EditStylesModal.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/front-src/client/components/Panels/Panel/Widget/PanelSelectModal.svelte b/front-src/client/components/Panels/Panel/Widget/PanelSelectModal.svelte new file mode 100644 index 00000000..697bfc95 --- /dev/null +++ b/front-src/client/components/Panels/Panel/Widget/PanelSelectModal.svelte @@ -0,0 +1,49 @@ + + + +
+ + +
+
diff --git a/front-src/client/components/Twitch/ConnectAtStartup.svelte b/front-src/client/components/Twitch/ConnectAtStartup.svelte new file mode 100644 index 00000000..5bf84524 --- /dev/null +++ b/front-src/client/components/Twitch/ConnectAtStartup.svelte @@ -0,0 +1,20 @@ + + + diff --git a/front-src/client/components/Twitch/Login.svelte b/front-src/client/components/Twitch/Login.svelte new file mode 100644 index 00000000..c3366d8f --- /dev/null +++ b/front-src/client/components/Twitch/Login.svelte @@ -0,0 +1,65 @@ + + +{#if $user} +
+ + {$user.display_name} + {#if status} +
+ + +
+ {/if} +
+{:else} +
+
+ +
+ +
+{/if} diff --git a/front-src/client/components/Twitch/StatusLine.svelte b/front-src/client/components/Twitch/StatusLine.svelte new file mode 100644 index 00000000..2812d748 --- /dev/null +++ b/front-src/client/components/Twitch/StatusLine.svelte @@ -0,0 +1,16 @@ + + +
+ {label} + +
diff --git a/front-src/client/components/Twitch/StatusSpinner.svelte b/front-src/client/components/Twitch/StatusSpinner.svelte new file mode 100644 index 00000000..221ccf02 --- /dev/null +++ b/front-src/client/components/Twitch/StatusSpinner.svelte @@ -0,0 +1,28 @@ + + + + +{#if !connected} +
+
+{/if} diff --git a/front-src/client/components/Twitch/StreamStatus.svelte b/front-src/client/components/Twitch/StreamStatus.svelte new file mode 100644 index 00000000..3e434abb --- /dev/null +++ b/front-src/client/components/Twitch/StreamStatus.svelte @@ -0,0 +1,16 @@ + + +
+ {#if $stream} +
+ + {$stream.viewer_count} +
+ {/if} +
diff --git a/client-src/components/UI/Button.svelte b/front-src/client/components/UI/Button.svelte similarity index 81% rename from client-src/components/UI/Button.svelte rename to front-src/client/components/UI/Button.svelte index 192de17a..e7b1db99 100644 --- a/client-src/components/UI/Button.svelte +++ b/front-src/client/components/UI/Button.svelte @@ -9,7 +9,7 @@ export let iconSize = null; export let iconColor = null; export let textColor = null; - export let padding = "px-4 py-2"; + export let padding = "p-2"; let _textColor = dark ? "text-light" : "text-dark"; @@ -25,7 +25,7 @@ + +
+
+ diff --git a/front-src/client/components/UI/ContextMenu.svelte b/front-src/client/components/UI/ContextMenu.svelte new file mode 100644 index 00000000..2e5b3157 --- /dev/null +++ b/front-src/client/components/UI/ContextMenu.svelte @@ -0,0 +1,70 @@ + + + + +
+ +
+ +{#if opened} + +
+ +
+
+{/if} diff --git a/client-src/components/UI/FileIcon.svelte b/front-src/client/components/UI/FileIcon.svelte similarity index 87% rename from client-src/components/UI/FileIcon.svelte rename to front-src/client/components/UI/FileIcon.svelte index 9392fc0b..b19d0d92 100644 --- a/client-src/components/UI/FileIcon.svelte +++ b/front-src/client/components/UI/FileIcon.svelte @@ -2,10 +2,11 @@ import Icon from "./Icon.svelte"; import MdImage from "svelte-icons/md/MdImage.svelte"; + import MdBugReport from "svelte-icons/md/MdBugReport.svelte"; import MdMusicVideo from "svelte-icons/md/MdMusicVideo.svelte"; import MdDescription from "svelte-icons/md/MdDescription.svelte"; + import MdFontDownload from "svelte-icons/md/MdFontDownload.svelte"; import MdOndemandVideo from "svelte-icons/md/MdOndemandVideo.svelte"; - import MdBugReport from "svelte-icons/md/MdBugReport.svelte"; export let type; export let defaultIcon = MdBugReport; @@ -15,6 +16,7 @@ image: MdImage, video: MdOndemandVideo, text: MdDescription, + font: MdFontDownload, }; let icon = icons[type] || defaultIcon; diff --git a/client-src/components/UI/FileInput.svelte b/front-src/client/components/UI/FileInput.svelte similarity index 100% rename from client-src/components/UI/FileInput.svelte rename to front-src/client/components/UI/FileInput.svelte diff --git a/client-src/components/UI/Flexbar.svelte b/front-src/client/components/UI/Flexbar.svelte similarity index 100% rename from client-src/components/UI/Flexbar.svelte rename to front-src/client/components/UI/Flexbar.svelte diff --git a/client-src/components/UI/Flexbar/Spacer.svelte b/front-src/client/components/UI/Flexbar/Spacer.svelte similarity index 100% rename from client-src/components/UI/Flexbar/Spacer.svelte rename to front-src/client/components/UI/Flexbar/Spacer.svelte diff --git a/front-src/client/components/UI/Fontpicker.svelte b/front-src/client/components/UI/Fontpicker.svelte new file mode 100644 index 00000000..33e0be4b --- /dev/null +++ b/front-src/client/components/UI/Fontpicker.svelte @@ -0,0 +1,45 @@ + + +{#if !fonts} + {_('sentences.loading-fonts-list')} +{:else} + - import api from "@/api/obs"; import { _ } from "@/libs/i18next"; import { state } from "@/stores/obs"; + import api from "@/api/actions"; import WidgetWrapper from "@/components/Widgets/OBS/WidgetWrapper.svelte"; export let widget; @@ -14,8 +14,14 @@ return scene === scene2 ? selectedClass : ""; } + function triggerAction() { + api.push({ type: "obs", widget }).catch((error) => { + console.log(">>>Error:", error); + }); + } + function onClick() { - scene && api.emit("SetCurrentScene", { "scene-name": scene }); + scene && triggerAction(); } $: cls = scene ? "cursor-pointer" : "cursor-not-allowed"; diff --git a/client-src/components/Widgets/OBS/GoToScene/config.js b/front-src/client/components/Widgets/OBS/GoToScene/config.js similarity index 72% rename from client-src/components/Widgets/OBS/GoToScene/config.js rename to front-src/client/components/Widgets/OBS/GoToScene/config.js index 7ef20faa..e3079b44 100644 --- a/client-src/components/Widgets/OBS/GoToScene/config.js +++ b/front-src/client/components/Widgets/OBS/GoToScene/config.js @@ -1,6 +1,8 @@ export default { name: "GoToScene", label: "obs.go-to-scene", + hasTrigger: true, + hasEvent: true, props: { scene: null, }, diff --git a/client-src/components/Widgets/OBS/GoToScene/index.js b/front-src/client/components/Widgets/OBS/GoToScene/index.js similarity index 100% rename from client-src/components/Widgets/OBS/GoToScene/index.js rename to front-src/client/components/Widgets/OBS/GoToScene/index.js diff --git a/client-src/components/Widgets/OBS/SceneList/Widget.svelte b/front-src/client/components/Widgets/OBS/SceneList/Widget.svelte similarity index 72% rename from client-src/components/Widgets/OBS/SceneList/Widget.svelte rename to front-src/client/components/Widgets/OBS/SceneList/Widget.svelte index 93170b2f..9473b256 100644 --- a/client-src/components/Widgets/OBS/SceneList/Widget.svelte +++ b/front-src/client/components/Widgets/OBS/SceneList/Widget.svelte @@ -1,6 +1,6 @@ -
+
{#each scenes as scene}
-
+
+ + +
diff --git a/front-src/client/components/Widgets/Twitch/Commands/Command.svelte b/front-src/client/components/Widgets/Twitch/Commands/Command.svelte new file mode 100644 index 00000000..16ae4e4f --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Commands/Command.svelte @@ -0,0 +1,74 @@ + + +
+
+
+
+ {$commandStore.prefix}{command.name} + {#if usage}{usage}{/if} +
+
+ {#if command.description} +
{command.description}
+ {/if} +
+ +
+
+ +
+
+ +
+
+ +
+
+
+ + diff --git a/front-src/client/components/Widgets/Twitch/Commands/EditCommandModal.svelte b/front-src/client/components/Widgets/Twitch/Commands/EditCommandModal.svelte new file mode 100644 index 00000000..1b14f0d5 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Commands/EditCommandModal.svelte @@ -0,0 +1,65 @@ + + + +
+ + + + +
+
{_('words.message')}
+ +
+ +
+
diff --git a/front-src/client/components/Widgets/Twitch/Commands/Settings.svelte b/front-src/client/components/Widgets/Twitch/Commands/Settings.svelte new file mode 100644 index 00000000..a070fc7d --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Commands/Settings.svelte @@ -0,0 +1,22 @@ + + +
+ +
diff --git a/front-src/client/components/Widgets/Twitch/Commands/Widget.svelte b/front-src/client/components/Widgets/Twitch/Commands/Widget.svelte new file mode 100644 index 00000000..d81c6203 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Commands/Widget.svelte @@ -0,0 +1,24 @@ + + + +
+ +
+ {#each $commands as command} + + {:else} +
{_('twitch.empty-command-list')}
+ {/each} +
+
+
diff --git a/front-src/client/components/Widgets/Twitch/Commands/config.js b/front-src/client/components/Widgets/Twitch/Commands/config.js new file mode 100644 index 00000000..8f7e92f7 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Commands/config.js @@ -0,0 +1,6 @@ +export default { + name: "TwitchCommands", + label: "twitch.commands", + hasTrigger: false, + hasEvent: false, +}; diff --git a/front-src/client/components/Widgets/Twitch/Commands/index.js b/front-src/client/components/Widgets/Twitch/Commands/index.js new file mode 100644 index 00000000..72c78896 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Commands/index.js @@ -0,0 +1,3 @@ +export { default as Settings } from "./Settings.svelte"; +export { default as Widget } from "./Widget.svelte"; +export { default as config } from "./config"; diff --git a/front-src/client/components/Widgets/Twitch/Followers/Follower.svelte b/front-src/client/components/Widgets/Twitch/Followers/Follower.svelte new file mode 100644 index 00000000..9e9c6d11 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Followers/Follower.svelte @@ -0,0 +1,23 @@ + + +
+
{time}
+
{follower.name}
+
diff --git a/front-src/client/components/Widgets/Twitch/Followers/Widget.svelte b/front-src/client/components/Widgets/Twitch/Followers/Widget.svelte new file mode 100644 index 00000000..63a2ada1 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Followers/Widget.svelte @@ -0,0 +1,22 @@ + + + +
+
+ {#each $followers as follower} + + {:else} +
{_('twitch.empty-follower-list')}
+ {/each} +
+
+
diff --git a/front-src/client/components/Widgets/Twitch/Followers/config.js b/front-src/client/components/Widgets/Twitch/Followers/config.js new file mode 100644 index 00000000..8f2bcce5 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Followers/config.js @@ -0,0 +1,6 @@ +export default { + name: "TwitchFollowers", + label: "twitch.followers", + hasTrigger: false, + hasEvent: false, +}; diff --git a/front-src/client/components/Widgets/Twitch/Followers/index.js b/front-src/client/components/Widgets/Twitch/Followers/index.js new file mode 100644 index 00000000..c6dadb4b --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Followers/index.js @@ -0,0 +1,2 @@ +export { default as Widget } from "./Widget.svelte"; +export { default as config } from "./config"; diff --git a/front-src/client/components/Widgets/Twitch/Rewards/Reward.svelte b/front-src/client/components/Widgets/Twitch/Rewards/Reward.svelte new file mode 100644 index 00000000..fcea2905 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Rewards/Reward.svelte @@ -0,0 +1,44 @@ + + +
+
+
+ {reward.title} + {reward.title} + {reward.cost} +
+
{reward.prompt}
+
+ + {#if !reward.is_enabled} +
+
+ {_('words.disabled')} +
+
+ {/if} +
diff --git a/front-src/client/components/Widgets/Twitch/Rewards/Widget.svelte b/front-src/client/components/Widgets/Twitch/Rewards/Widget.svelte new file mode 100644 index 00000000..14cf99ed --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Rewards/Widget.svelte @@ -0,0 +1,36 @@ + + + + +
+ {#each $rewards as reward} + + {:else} +
{_('twitch.empty-reward-list')}
+ {/each} +
+
diff --git a/front-src/client/components/Widgets/Twitch/Rewards/config.js b/front-src/client/components/Widgets/Twitch/Rewards/config.js new file mode 100644 index 00000000..134d0c4f --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Rewards/config.js @@ -0,0 +1,6 @@ +export default { + name: "TwitchRewards", + label: "twitch.rewards", + hasTrigger: false, + hasEvent: false, +}; diff --git a/front-src/client/components/Widgets/Twitch/Rewards/index.js b/front-src/client/components/Widgets/Twitch/Rewards/index.js new file mode 100644 index 00000000..c6dadb4b --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Rewards/index.js @@ -0,0 +1,2 @@ +export { default as Widget } from "./Widget.svelte"; +export { default as config } from "./config"; diff --git a/front-src/client/components/Widgets/Twitch/Stream/Settings.svelte b/front-src/client/components/Widgets/Twitch/Stream/Settings.svelte new file mode 100644 index 00000000..501c193a --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Stream/Settings.svelte @@ -0,0 +1,42 @@ + + +
+ + + +
diff --git a/front-src/client/components/Widgets/Twitch/Stream/Widget.svelte b/front-src/client/components/Widgets/Twitch/Stream/Widget.svelte new file mode 100644 index 00000000..5f0a8106 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Stream/Widget.svelte @@ -0,0 +1,24 @@ + + + + + diff --git a/front-src/client/components/Widgets/Twitch/Stream/config.js b/front-src/client/components/Widgets/Twitch/Stream/config.js new file mode 100644 index 00000000..04ebe9d8 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Stream/config.js @@ -0,0 +1,11 @@ +export default { + name: "TwitchStream", + label: "twitch.stream", + hasTrigger: false, + hasEvent: false, + props: { + channel: null, + autoplay: true, + muted: true, + }, +}; diff --git a/front-src/client/components/Widgets/Twitch/Stream/index.js b/front-src/client/components/Widgets/Twitch/Stream/index.js new file mode 100644 index 00000000..72c78896 --- /dev/null +++ b/front-src/client/components/Widgets/Twitch/Stream/index.js @@ -0,0 +1,3 @@ +export { default as Settings } from "./Settings.svelte"; +export { default as Widget } from "./Widget.svelte"; +export { default as config } from "./config"; diff --git a/client-src/components/Widgets/WidgetLabel.svelte b/front-src/client/components/Widgets/WidgetLabel.svelte similarity index 100% rename from client-src/components/Widgets/WidgetLabel.svelte rename to front-src/client/components/Widgets/WidgetLabel.svelte diff --git a/front-src/client/components/Widgets/WidgetWrapper.svelte b/front-src/client/components/Widgets/WidgetWrapper.svelte new file mode 100644 index 00000000..dc6eb245 --- /dev/null +++ b/front-src/client/components/Widgets/WidgetWrapper.svelte @@ -0,0 +1,124 @@ + + +
+
+ +{#if action && action.inQueue} +
+ {#if action.running} +
+ +
+ {#if elapsedTime > -1} +
+ {ms(elapsedTime)} +
+ {/if} + {/if} +
+
+ {action.inQueue} +
+
+
+ +
+
+{/if} diff --git a/front-src/client/components/Widgets/index.js b/front-src/client/components/Widgets/index.js new file mode 100644 index 00000000..abb0bd5e --- /dev/null +++ b/front-src/client/components/Widgets/index.js @@ -0,0 +1,23 @@ +import * as SceneList from "./OBS/SceneList"; +import * as GoToScene from "./OBS/GoToScene"; +import * as ToggleScene from "./OBS/ToggleScene"; +import * as AnimeTimeline from "./Anime/Timeline"; +import * as TwitchChat from "./Twitch/Chat"; +import * as TwitchStream from "./Twitch/Stream"; +import * as TwitchRewards from "./Twitch/Rewards"; +import * as TwitchCommands from "./Twitch/Commands"; +import * as TwitchFollowers from "./Twitch/Followers"; + +const widgets = { + SceneList, + GoToScene, + ToggleScene, + AnimeTimeline, + TwitchChat, + TwitchStream, + TwitchRewards, + TwitchCommands, + TwitchFollowers, +}; + +export default widgets; diff --git a/client-src/index.js b/front-src/client/index.js similarity index 69% rename from client-src/index.js rename to front-src/client/index.js index c0860512..7ffea570 100644 --- a/client-src/index.js +++ b/front-src/client/index.js @@ -1,8 +1,5 @@ "use strict"; -import io from "@/libs/socket.io"; import App from "@/components/App.svelte"; -io(); - new App({ target: document.body }); diff --git a/front-src/client/libs/app.js b/front-src/client/libs/app.js new file mode 100644 index 00000000..ad10053c --- /dev/null +++ b/front-src/client/libs/app.js @@ -0,0 +1,25 @@ +import axios from "axios"; +import api from "@/api/app"; + +const extsToOS = { + deb: "linux", + AppImage: "linux", + exe: "win32", + dmg: "darwin", + pkg: "darwin", +}; + +export function getLastRelease(repo) { + const url = `https://api.github.com/repos/${repo}/releases/latest`; + return axios.get(url).then(async (res) => { + const exts = {}; + + res.data.assets.forEach((asset) => { + const url = asset.browser_download_url; + const ext = url.split(".").pop(); + exts[extsToOS[ext]] = url; + }); + + return { version: res.data.tag_name, url: exts[await api.getOS()] }; + }); +} diff --git a/front-src/client/libs/docs.js b/front-src/client/libs/docs.js new file mode 100644 index 00000000..cf368849 --- /dev/null +++ b/front-src/client/libs/docs.js @@ -0,0 +1,19 @@ +import { store, siteURL } from "@/stores/app"; +import { get } from "svelte/store"; + +const languages = ["en", "fr"]; + +const getStartedLinks = { + en: `/get-started/`, + fr: `/demarrage-rapide/`, +}; + +export function url(uri) { + let lang = get(store).language; + lang = languages.includes(lang) ? lang : languages[0]; + return `${get(siteURL)}/${lang}/docs/${uri}`; +} + +export function getStartURL() { + return url(getStartedLinks[get(store).language] || getStartedLinks.en); +} diff --git a/client-src/libs/i18next.js b/front-src/client/libs/i18next.js similarity index 100% rename from client-src/libs/i18next.js rename to front-src/client/libs/i18next.js index 0677c54b..ffedd896 100644 --- a/client-src/libs/i18next.js +++ b/front-src/client/libs/i18next.js @@ -9,8 +9,8 @@ async function init(options) { _ = await i18next.use(HttpApi).init({ ...options, backend: { - loadPath: "/locales/{{lng}}/{{ns}}.json", addPath: "/locales/add/{{lng}}/{{ns}}", + loadPath: "/locales/{{lng}}/{{ns}}.json", }, }); diff --git a/front-src/client/libs/panels.js b/front-src/client/libs/panels.js new file mode 100644 index 00000000..2ad96308 --- /dev/null +++ b/front-src/client/libs/panels.js @@ -0,0 +1,13 @@ +import api from "@/api/panels"; + +export function updateReducer({ id, x, y, w, h }) { + return { id, x, y, w, h }; +} + +export function update(panel) { + return api.update({ ...panel, grid: panel.grid.map(updateReducer) }); +} + +export function removeWidgetComponent(panel, widget) { + return api.removeWidgetComponent(panel, widget); +} diff --git a/front-src/client/libs/socket.io.js b/front-src/client/libs/socket.io.js new file mode 100644 index 00000000..c9282046 --- /dev/null +++ b/front-src/client/libs/socket.io.js @@ -0,0 +1,3 @@ +import io from "../../libs/socket.io"; + +export const { on, emit } = io(); diff --git a/client-src/libs/svelte/click-outside.js b/front-src/client/libs/svelte/click-outside.js similarity index 77% rename from client-src/libs/svelte/click-outside.js rename to front-src/client/libs/svelte/click-outside.js index 7030a332..539fdf50 100644 --- a/client-src/libs/svelte/click-outside.js +++ b/front-src/client/libs/svelte/click-outside.js @@ -9,10 +9,12 @@ export default function clickoutside(node) { } document.addEventListener("click", onClick); + document.addEventListener("contextmenu", onClick); return { destroy() { document.removeEventListener("click", onClick); + document.removeEventListener("contextmenu", onClick); }, }; } diff --git a/client-src/libs/svelte/double-tap.js b/front-src/client/libs/svelte/double-tap.js similarity index 100% rename from client-src/libs/svelte/double-tap.js rename to front-src/client/libs/svelte/double-tap.js diff --git a/client-src/libs/svelte/pannable.js b/front-src/client/libs/svelte/pannable.js similarity index 71% rename from client-src/libs/svelte/pannable.js rename to front-src/client/libs/svelte/pannable.js index b5678fb9..98e2c265 100644 --- a/client-src/libs/svelte/pannable.js +++ b/front-src/client/libs/svelte/pannable.js @@ -10,9 +10,11 @@ export default function pannable(node) { function handleMousedown(event) { updateCoords(event); - node.dispatchEvent(new CustomEvent("panstart", { - detail: { x, y } - })); + node.dispatchEvent( + new CustomEvent("panstart", { + detail: { x, y }, + }) + ); window.addEventListener("mousemove", handleMousemove); window.addEventListener("mouseup", handleMouseup); @@ -24,17 +26,21 @@ export default function pannable(node) { updateCoords(event); - node.dispatchEvent(new CustomEvent("panmove", { - detail: { x, y, dx, dy } - })); + node.dispatchEvent( + new CustomEvent("panmove", { + detail: { x, y, dx, dy }, + }) + ); } function handleMouseup(event) { updateCoords(event); - node.dispatchEvent(new CustomEvent("panend", { - detail: { x, y } - })); + node.dispatchEvent( + new CustomEvent("panend", { + detail: { x, y }, + }) + ); window.removeEventListener("mousemove", handleMousemove); window.removeEventListener("mouseup", handleMouseup); @@ -45,6 +51,6 @@ export default function pannable(node) { return { destroy() { node.removeEventListener("mousedown", handleMousedown); - } + }, }; } diff --git a/front-src/client/libs/utils.js b/front-src/client/libs/utils.js new file mode 100644 index 00000000..63fac3f2 --- /dev/null +++ b/front-src/client/libs/utils.js @@ -0,0 +1,8 @@ +import { i18next } from "@/libs/i18next"; + +export function localeSort(a, b) { + return a.localeCompare(b, i18next.language, { + numeric: true, + ignorePunctuation: true, + }); +} diff --git a/client-src/stores/actions.js b/front-src/client/stores/actions.js similarity index 53% rename from client-src/stores/actions.js rename to front-src/client/stores/actions.js index 08d23e1d..55870cff 100644 --- a/client-src/stores/actions.js +++ b/front-src/client/stores/actions.js @@ -1,9 +1,9 @@ import { writable } from "svelte/store"; -import { on, getState } from "@/libs/actions"; +import api from "@/api/actions"; export const store = writable({}); export default async function load() { - store.set(await getState()); - on("state", store.set); + store.set(await api.getState()); + api.on("state", store.set); } diff --git a/front-src/client/stores/app.js b/front-src/client/stores/app.js new file mode 100644 index 00000000..03233f1b --- /dev/null +++ b/front-src/client/stores/app.js @@ -0,0 +1,17 @@ +import { name, version } from "../../../package"; +import { readable, writable } from "svelte/store"; +import capitalize from "capitalize"; +import api from "@/api/app"; + +const query = new URLSearchParams(location.search); + +export const store = writable(null); +export const initialized = writable(false); +export const repo = readable("skarab42/marv"); +export const siteURL = readable(`https://marv-site.web.app/`); +export const fingerprint = capitalize(`${name} - v${version}`); +export const electron = query.has("electron"); + +export default async function load() { + store.set(await api.getSettings()); +} diff --git a/front-src/client/stores/command.js b/front-src/client/stores/command.js new file mode 100644 index 00000000..55bb8f2c --- /dev/null +++ b/front-src/client/stores/command.js @@ -0,0 +1,8 @@ +import { writable } from "svelte/store"; +import api from "@/api/command"; + +export const command = writable(null); + +export default async function load() { + command.set(await api.getSettings()); +} diff --git a/client-src/stores/drawer.js b/front-src/client/stores/drawer.js similarity index 100% rename from client-src/stores/drawer.js rename to front-src/client/stores/drawer.js diff --git a/client-src/stores/files.js b/front-src/client/stores/files.js similarity index 84% rename from client-src/stores/files.js rename to front-src/client/stores/files.js index d381bf96..e81559d4 100644 --- a/client-src/stores/files.js +++ b/front-src/client/stores/files.js @@ -1,5 +1,4 @@ import { writable } from "svelte/store"; -import { emit } from "@/libs/socket.io"; import api from "@/api/files"; export const store = writable([]); @@ -22,6 +21,6 @@ function loadOnce() { } export default async function load() { - store.set(await emit("files.getFileList")); + store.set(await api.getFileList()); loadOnce(); } diff --git a/client-src/stores/i18next.js b/front-src/client/stores/i18next.js similarity index 74% rename from client-src/stores/i18next.js rename to front-src/client/stores/i18next.js index cb9d06c3..6439fda3 100644 --- a/client-src/stores/i18next.js +++ b/front-src/client/stores/i18next.js @@ -1,6 +1,6 @@ import { writable } from "svelte/store"; -import { emit } from "@/libs/socket.io"; import { i18next } from "@/libs/i18next"; +import api from "@/api/i18next"; export let store = writable(null); @@ -11,13 +11,13 @@ export function update(props) { } export default async function load() { - const state = await emit("stores.i18next", "getAll"); + const state = await api.getConfig(); store.set(state); return state; } export async function changeLanguage(language) { - await emit("i18next.changeLanguage", language); await i18next.changeLanguage(language); + await api.changeLanguage(language); update({ lng: language }); } diff --git a/client-src/stores/obs.js b/front-src/client/stores/obs.js similarity index 66% rename from client-src/stores/obs.js rename to front-src/client/stores/obs.js index 94f3e401..fd1f2e75 100644 --- a/client-src/stores/obs.js +++ b/front-src/client/stores/obs.js @@ -1,5 +1,5 @@ import { writable } from "svelte/store"; -import obs from "@/api/obs"; +import api from "@/api/obs"; export const store = writable(null); export const state = writable(null); @@ -9,13 +9,13 @@ let loaded = false; function loadOnce() { if (loaded) return; - obs.on("state", state.set); + api.on("state", state.set); loaded = true; } export default async function load() { - store.set(await obs.getStore()); - state.set(await obs.getState()); + store.set(await api.getSettings()); + state.set(await api.getState()); loadOnce(); } diff --git a/front-src/client/stores/overlay.js b/front-src/client/stores/overlay.js new file mode 100644 index 00000000..fbbbfd46 --- /dev/null +++ b/front-src/client/stores/overlay.js @@ -0,0 +1,11 @@ +import { writable } from "svelte/store"; +import api from "@/api/overlay"; + +export const connected = writable(null); + +api.on("connected", () => connected.set(true)); +api.on("disconnected", () => connected.set(false)); + +export default async function load() { + connected.set(await api.isConnected()); +} diff --git a/client-src/stores/panels.js b/front-src/client/stores/panels.js similarity index 63% rename from client-src/stores/panels.js rename to front-src/client/stores/panels.js index bfe2e002..14349092 100644 --- a/client-src/stores/panels.js +++ b/front-src/client/stores/panels.js @@ -5,6 +5,7 @@ import api from "@/api/panels"; export const panels = writable([]); export const editMode = writable(false); export const currentPanel = writable(null); +export const selectedWidget = writable(null); export const itemOptions = writable({ w: 2, h: 2 }); export const gridOptions = writable({ gap: 4, @@ -17,6 +18,11 @@ export const gridOptions = writable({ let loaded = false; +export function setPanels(newPanels) { + panels.set(newPanels); + api.set(newPanels); +} + export function updateEditMode() { panels.update((state) => { return state.map((panel) => { @@ -41,6 +47,37 @@ export function setCurrentPanel(panel) { localStorage.setItem("currentPanel", panel && panel.id); } +function findSpaceForWidget(panel, props = {}) { + const cols = get(gridOptions).cols; + const item = { ...gridHelper.item(get(itemOptions)), ...props }; + const pos = gridHelper.findSpaceForItem(item, panel.grid, cols); + return { w: item.w, h: item.h, ...pos }; +} + +export async function addWidget() { + const panel = get(currentPanel); + await api.addWidget(panel, findSpaceForWidget(panel)); + setEditMode(true); +} + +export async function duplicateWidget({ panel, item }) { + const position = findSpaceForWidget(panel, { w: item.w, h: item.h }); + const res = await api.duplicateWidget({ panel, widgetId: item.id, position }); + setEditMode(true); + return res; +} + +export async function moveWidgetToPanel({ panel, targetPanel, item }) { + const position = findSpaceForWidget(targetPanel, { w: item.w, h: item.h }); + await api.moveWidgetToPanel({ + panel, + targetPanel, + widgetId: item.id, + position, + }); + setEditMode(true); +} + function onAdd(panel, { owner }) { panels.update((state) => [...state, panel]); if (owner || !get(currentPanel)) { @@ -89,9 +126,14 @@ function onUpdate(panel) { } } +function onSet(newPanels) { + panels.set(newPanels); +} + function loadOnce() { if (loaded) return; api.on("add", onAdd); + api.on("set", onSet); api.on("remove", onRemove); api.on("update", onUpdate); loaded = true; @@ -99,10 +141,10 @@ function loadOnce() { export default async function load() { const store = await api.getStore(); - store.panels.forEach(makeGrid); - panels.set(store.panels); + store.forEach(makeGrid); + panels.set(store); const panelId = localStorage.getItem("currentPanel"); - const panel = store.panels.find((panel) => panel.id === panelId); - setCurrentPanel(panel || store.panels[0]); + const panel = store.find((panel) => panel.id === panelId); + setCurrentPanel(panel || store[0]); loadOnce(); } diff --git a/front-src/client/stores/twitch.js b/front-src/client/stores/twitch.js new file mode 100644 index 00000000..7c11c800 --- /dev/null +++ b/front-src/client/stores/twitch.js @@ -0,0 +1,66 @@ +import { writable } from "svelte/store"; +import api from "@/api/twitch"; + +export const store = writable(null); +export const stream = writable(null); +export const user = writable(null); +export const chat = writable(null); +export const pubsub = writable(null); +export const commands = writable([]); +export const rewards = writable([]); +export const followers = writable([]); + +let loaded = false; + +async function loadOnce() { + if (loaded) return; + + api.on("state.stream", stream.set); + api.on("state.pubsub", pubsub.set); + api.on("state.user", user.set); + api.on("state.chat", chat.set); + + api.on("addCommand", (command) => { + commands.update((state) => { + return [command, ...state]; + }); + }); + + api.on("updateCommand", (command) => { + commands.update((state) => { + return state.map((cmd) => + cmd.id === command.id ? { ...cmd, ...command } : cmd + ); + }); + }); + + api.on("removeCommand", (command) => { + commands.update((state) => { + return state.filter((cmd) => cmd.id !== command.id); + }); + }); + + loaded = true; +} + +export default async function load() { + store.set(await api.getSettings()); + + const state = await api.getState(); + + stream.set(state.stream); + pubsub.set(state.pubsub); + user.set(state.user); + chat.set(state.chat); + + commands.set(await api.getCommandList()); + + if (state.user) { + if (state.user.broadcaster_type.length) { + rewards.set(await api.getRewardList()); + } + followers.set(await api.getLastFollowers()); + } + + await loadOnce(); +} diff --git a/front-src/libs/fonts/getFonts.js b/front-src/libs/fonts/getFonts.js new file mode 100644 index 00000000..712d19f0 --- /dev/null +++ b/front-src/libs/fonts/getFonts.js @@ -0,0 +1,5 @@ +import api from "@/api/app"; + +export default async function getFonts() { + return await api.getFonts(); +} diff --git a/front-src/libs/fonts/getUsedFonts.js b/front-src/libs/fonts/getUsedFonts.js new file mode 100644 index 00000000..5c000f03 --- /dev/null +++ b/front-src/libs/fonts/getUsedFonts.js @@ -0,0 +1,5 @@ +import api from "@/api/app"; + +export default async function getUsedFonts() { + return await api.getUsedFonts(); +} diff --git a/front-src/libs/fonts/index.js b/front-src/libs/fonts/index.js new file mode 100644 index 00000000..27d18a53 --- /dev/null +++ b/front-src/libs/fonts/index.js @@ -0,0 +1,4 @@ +export { default as getFonts } from "./getFonts"; +export { default as loadFont } from "./loadFont"; +export { default as getUsedFonts } from "./getUsedFonts"; +export { default as loadUsedFonts } from "./loadUsedFonts"; diff --git a/front-src/libs/fonts/loadFont.js b/front-src/libs/fonts/loadFont.js new file mode 100644 index 00000000..5307aeb5 --- /dev/null +++ b/front-src/libs/fonts/loadFont.js @@ -0,0 +1,18 @@ +import api from "@/api/app"; + +const loadedFonts = new Map(); + +export default async function loadFont(url, notify = true) { + if (loadedFonts.has(url)) { + return loadedFonts.get(url); + } + + const fontFace = new FontFace(url, `url(${encodeURI(url)})`); + loadedFonts.set(url, fontFace); + + await fontFace.load(); + notify && api.loadFont(url); + document.fonts.add(fontFace); + + return fontFace; +} diff --git a/front-src/libs/fonts/loadUsedFonts.js b/front-src/libs/fonts/loadUsedFonts.js new file mode 100644 index 00000000..6a59c9fb --- /dev/null +++ b/front-src/libs/fonts/loadUsedFonts.js @@ -0,0 +1,12 @@ +import getUsedFonts from "./getUsedFonts"; +import loadFont from "./loadFont"; +import getFonts from "./getFonts"; + +export default async function loadUsedFonts(notify = true) { + const usedFonts = await getUsedFonts(); + const fonts = await getFonts(); + + usedFonts.forEach((url) => loadFont(url, notify)); + + return fonts; +} diff --git a/front-src/libs/socket.io.js b/front-src/libs/socket.io.js new file mode 100644 index 00000000..ea6dd0cb --- /dev/null +++ b/front-src/libs/socket.io.js @@ -0,0 +1,34 @@ +import client from "socket.io-client"; + +const defaultOptions = { + transports: ["websocket"], + upgrade: false, +}; + +export default function io(ns = "", options = {}) { + let socket = client(ns, { ...defaultOptions, ...options }); + + return { + socket, + + on(...args) { + if (!socket) { + throw new Error("socket.io: Not connected"); + } + + socket.on(...args); + }, + + emit(...args) { + return new Promise((resolve, reject) => { + if (!socket) { + return reject(new Error("socket.io: Not connected")); + } + + socket.emit(...args, ({ payload, error }) => { + error ? reject(error) : resolve(payload); + }); + }); + }, + }; +} diff --git a/front-src/overlay/libs/ejs.js b/front-src/overlay/libs/ejs.js new file mode 100644 index 00000000..497fdfe9 --- /dev/null +++ b/front-src/overlay/libs/ejs.js @@ -0,0 +1,1661 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + * @author Tiancheng "Timothy" Gu + * @project EJS + * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0} + */ + +/** + * EJS internal functions. + * + * Technically this "module" lies in the same file as {@link module:ejs}, for + * the sake of organization all the private functions re grouped into this + * module. + * + * @module ejs-internal + * @private + */ + +/** + * Embedded JavaScript templating engine. + * + * @module ejs + * @public + */ + +var fs = require('fs'); +var path = require('path'); +var utils = require('./utils'); + +var scopeOptionWarned = false; +/** @type {string} */ +var _VERSION_STRING = require('../package.json').version; +var _DEFAULT_OPEN_DELIMITER = '<'; +var _DEFAULT_CLOSE_DELIMITER = '>'; +var _DEFAULT_DELIMITER = '%'; +var _DEFAULT_LOCALS_NAME = 'locals'; +var _NAME = 'ejs'; +var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)'; +var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug', + 'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async']; +// We don't allow 'cache' option to be passed in the data obj for +// the normal `render` call, but this is where Express 2 & 3 put it +// so we make an exception for `renderFile` +var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache'); +var _BOM = /^\uFEFF/; + +/** + * EJS template function cache. This can be a LRU object from lru-cache NPM + * module. By default, it is {@link module:utils.cache}, a simple in-process + * cache that grows continuously. + * + * @type {Cache} + */ + +exports.cache = utils.cache; + +/** + * Custom file loader. Useful for template preprocessing or restricting access + * to a certain part of the filesystem. + * + * @type {fileLoader} + */ + +exports.fileLoader = fs.readFileSync; + +/** + * Name of the object containing the locals. + * + * This variable is overridden by {@link Options}`.localsName` if it is not + * `undefined`. + * + * @type {String} + * @public + */ + +exports.localsName = _DEFAULT_LOCALS_NAME; + +/** + * Promise implementation -- defaults to the native implementation if available + * This is mostly just for testability + * + * @type {PromiseConstructorLike} + * @public + */ + +exports.promiseImpl = (new Function('return this;'))().Promise; + +/** + * Get the path to the included file from the parent file path and the + * specified path. + * + * @param {String} name specified path + * @param {String} filename parent file path + * @param {Boolean} [isDir=false] whether the parent file path is a directory + * @return {String} + */ +exports.resolveInclude = function(name, filename, isDir) { + var dirname = path.dirname; + var extname = path.extname; + var resolve = path.resolve; + var includePath = resolve(isDir ? filename : dirname(filename), name); + var ext = extname(name); + if (!ext) { + includePath += '.ejs'; + } + return includePath; +}; + +/** + * Try to resolve file path on multiple directories + * + * @param {String} name specified path + * @param {Array} paths list of possible parent directory paths + * @return {String} + */ +function resolvePaths(name, paths) { + var filePath; + if (paths.some(function (v) { + filePath = exports.resolveInclude(name, v, true); + return fs.existsSync(filePath); + })) { + return filePath; + } +} + +/** + * Get the path to the included file by Options + * + * @param {String} path specified path + * @param {Options} options compilation options + * @return {String} + */ +function getIncludePath(path, options) { + var includePath; + var filePath; + var views = options.views; + var match = /^[A-Za-z]+:\\|^\//.exec(path); + + // Abs path + if (match && match.length) { + path = path.replace(/^\/*/, ''); + if (Array.isArray(options.root)) { + includePath = resolvePaths(path, options.root); + } else { + includePath = exports.resolveInclude(path, options.root || '/', true); + } + } + // Relative paths + else { + // Look relative to a passed filename first + if (options.filename) { + filePath = exports.resolveInclude(path, options.filename); + if (fs.existsSync(filePath)) { + includePath = filePath; + } + } + // Then look in any views directories + if (!includePath && Array.isArray(views)) { + includePath = resolvePaths(path, views); + } + if (!includePath && typeof options.includer !== 'function') { + throw new Error('Could not find the include file "' + + options.escapeFunction(path) + '"'); + } + } + return includePath; +} + +/** + * Get the template from a string or a file, either compiled on-the-fly or + * read from cache (if enabled), and cache the template if needed. + * + * If `template` is not set, the file specified in `options.filename` will be + * read. + * + * If `options.cache` is true, this function reads the file from + * `options.filename` so it must be set prior to calling this function. + * + * @memberof module:ejs-internal + * @param {Options} options compilation options + * @param {String} [template] template source + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned. + * @static + */ + +function handleCache(options, template) { + var func; + var filename = options.filename; + var hasTemplate = arguments.length > 1; + + if (options.cache) { + if (!filename) { + throw new Error('cache option requires a filename'); + } + func = exports.cache.get(filename); + if (func) { + return func; + } + if (!hasTemplate) { + template = fileLoader(filename).toString().replace(_BOM, ''); + } + } + else if (!hasTemplate) { + // istanbul ignore if: should not happen at all + if (!filename) { + throw new Error('Internal EJS error: no file name or template ' + + 'provided'); + } + template = fileLoader(filename).toString().replace(_BOM, ''); + } + func = exports.compile(template, options); + if (options.cache) { + exports.cache.set(filename, func); + } + return func; +} + +/** + * Try calling handleCache with the given options and data and call the + * callback with the result. If an error occurs, call the callback with + * the error. Used by renderFile(). + * + * @memberof module:ejs-internal + * @param {Options} options compilation options + * @param {Object} data template data + * @param {RenderFileCallback} cb callback + * @static + */ + +function tryHandleCache(options, data, cb) { + var result; + if (!cb) { + if (typeof exports.promiseImpl == 'function') { + return new exports.promiseImpl(function (resolve, reject) { + try { + result = handleCache(options)(data); + resolve(result); + } + catch (err) { + reject(err); + } + }); + } + else { + throw new Error('Please provide a callback function'); + } + } + else { + try { + result = handleCache(options)(data); + } + catch (err) { + return cb(err); + } + + cb(null, result); + } +} + +/** + * fileLoader is independent + * + * @param {String} filePath ejs file path. + * @return {String} The contents of the specified file. + * @static + */ + +function fileLoader(filePath){ + return exports.fileLoader(filePath); +} + +/** + * Get the template function. + * + * If `options.cache` is `true`, then the template is cached. + * + * @memberof module:ejs-internal + * @param {String} path path for the specified file + * @param {Options} options compilation options + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned + * @static + */ + +function includeFile(path, options) { + var opts = utils.shallowCopy({}, options); + opts.filename = getIncludePath(path, opts); + if (typeof options.includer === 'function') { + var includerResult = options.includer(path, opts.filename); + if (includerResult) { + if (includerResult.filename) { + opts.filename = includerResult.filename; + } + if (includerResult.template) { + return handleCache(opts, includerResult.template); + } + } + } + return handleCache(opts); +} + +/** + * Re-throw the given `err` in context to the `str` of ejs, `filename`, and + * `lineno`. + * + * @implements {RethrowCallback} + * @memberof module:ejs-internal + * @param {Error} err Error object + * @param {String} str EJS source + * @param {String} flnm file name of the EJS file + * @param {Number} lineno line number of the error + * @param {EscapeCallback} esc + * @static + */ + +function rethrow(err, str, flnm, lineno, esc) { + var lines = str.split('\n'); + var start = Math.max(lineno - 3, 0); + var end = Math.min(lines.length, lineno + 3); + var filename = esc(flnm); + // Error context + var context = lines.slice(start, end).map(function (line, i){ + var curr = i + start + 1; + return (curr == lineno ? ' >> ' : ' ') + + curr + + '| ' + + line; + }).join('\n'); + + // Alter exception message + err.path = filename; + err.message = (filename || 'ejs') + ':' + + lineno + '\n' + + context + '\n\n' + + err.message; + + throw err; +} + +function stripSemi(str){ + return str.replace(/;(\s*$)/, '$1'); +} + +/** + * Compile the given `str` of ejs into a template function. + * + * @param {String} template EJS template + * + * @param {Options} [opts] compilation options + * + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `opts.client`, either type might be returned. + * Note that the return type of the function also depends on the value of `opts.async`. + * @public + */ + +exports.compile = function compile(template, opts) { + var templ; + + // v1 compat + // 'scope' is 'context' + // FIXME: Remove this in a future version + if (opts && opts.scope) { + if (!scopeOptionWarned){ + console.warn('`scope` option is deprecated and will be removed in EJS 3'); + scopeOptionWarned = true; + } + if (!opts.context) { + opts.context = opts.scope; + } + delete opts.scope; + } + templ = new Template(template, opts); + return templ.compile(); +}; + +/** + * Render the given `template` of ejs. + * + * If you would like to include options but not data, you need to explicitly + * call this function with `data` being an empty object or `null`. + * + * @param {String} template EJS template + * @param {Object} [data={}] template data + * @param {Options} [opts={}] compilation and rendering options + * @return {(String|Promise)} + * Return value type depends on `opts.async`. + * @public + */ + +exports.render = function (template, d, o) { + var data = d || {}; + var opts = o || {}; + + // No options object -- if there are optiony names + // in the data, copy them to options + if (arguments.length == 2) { + utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA); + } + + return handleCache(opts, template)(data); +}; + +/** + * Render an EJS file at the given `path` and callback `cb(err, str)`. + * + * If you would like to include options but not data, you need to explicitly + * call this function with `data` being an empty object or `null`. + * + * @param {String} path path to the EJS file + * @param {Object} [data={}] template data + * @param {Options} [opts={}] compilation and rendering options + * @param {RenderFileCallback} cb callback + * @public + */ + +exports.renderFile = function () { + var args = Array.prototype.slice.call(arguments); + var filename = args.shift(); + var cb; + var opts = {filename: filename}; + var data; + var viewOpts; + + // Do we have a callback? + if (typeof arguments[arguments.length - 1] == 'function') { + cb = args.pop(); + } + // Do we have data/opts? + if (args.length) { + // Should always have data obj + data = args.shift(); + // Normal passed opts (data obj + opts obj) + if (args.length) { + // Use shallowCopy so we don't pollute passed in opts obj with new vals + utils.shallowCopy(opts, args.pop()); + } + // Special casing for Express (settings + opts-in-data) + else { + // Express 3 and 4 + if (data.settings) { + // Pull a few things from known locations + if (data.settings.views) { + opts.views = data.settings.views; + } + if (data.settings['view cache']) { + opts.cache = true; + } + // Undocumented after Express 2, but still usable, esp. for + // items that are unsafe to be passed along with data, like `root` + viewOpts = data.settings['view options']; + if (viewOpts) { + utils.shallowCopy(opts, viewOpts); + } + } + // Express 2 and lower, values set in app.locals, or people who just + // want to pass options in their data. NOTE: These values will override + // anything previously set in settings or settings['view options'] + utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS); + } + opts.filename = filename; + } + else { + data = {}; + } + + return tryHandleCache(opts, data, cb); +}; + +/** + * Clear intermediate JavaScript cache. Calls {@link Cache#reset}. + * @public + */ + +/** + * EJS template class + * @public + */ +exports.Template = Template; + +exports.clearCache = function () { + exports.cache.reset(); +}; + +function Template(text, opts) { + opts = opts || {}; + var options = {}; + this.templateText = text; + /** @type {string | null} */ + this.mode = null; + this.truncate = false; + this.currentLine = 1; + this.source = ''; + options.client = opts.client || false; + options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML; + options.compileDebug = opts.compileDebug !== false; + options.debug = !!opts.debug; + options.filename = opts.filename; + options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER; + options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER; + options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER; + options.strict = opts.strict || false; + options.context = opts.context; + options.cache = opts.cache || false; + options.rmWhitespace = opts.rmWhitespace; + options.root = opts.root; + options.includer = opts.includer; + options.outputFunctionName = opts.outputFunctionName; + options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME; + options.views = opts.views; + options.async = opts.async; + options.destructuredLocals = opts.destructuredLocals; + options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true; + + if (options.strict) { + options._with = false; + } + else { + options._with = typeof opts._with != 'undefined' ? opts._with : true; + } + + this.opts = options; + + this.regex = this.createRegex(); +} + +Template.modes = { + EVAL: 'eval', + ESCAPED: 'escaped', + RAW: 'raw', + COMMENT: 'comment', + LITERAL: 'literal' +}; + +Template.prototype = { + createRegex: function () { + var str = _REGEX_STRING; + var delim = utils.escapeRegExpChars(this.opts.delimiter); + var open = utils.escapeRegExpChars(this.opts.openDelimiter); + var close = utils.escapeRegExpChars(this.opts.closeDelimiter); + str = str.replace(/%/g, delim) + .replace(//g, close); + return new RegExp(str); + }, + + compile: function () { + /** @type {string} */ + var src; + /** @type {ClientFunction} */ + var fn; + var opts = this.opts; + var prepended = ''; + var appended = ''; + /** @type {EscapeCallback} */ + var escapeFn = opts.escapeFunction; + /** @type {FunctionConstructor} */ + var ctor; + + if (!this.source) { + this.generateSource(); + prepended += + ' var __output = "";\n' + + ' function __append(s) { if (s !== undefined && s !== null) __output += s }\n'; + if (opts.outputFunctionName) { + prepended += ' var ' + opts.outputFunctionName + ' = __append;' + '\n'; + } + if (opts.destructuredLocals && opts.destructuredLocals.length) { + var destructuring = ' var __locals = (' + opts.localsName + ' || {}),\n'; + for (var i = 0; i < opts.destructuredLocals.length; i++) { + var name = opts.destructuredLocals[i]; + if (i > 0) { + destructuring += ',\n '; + } + destructuring += name + ' = __locals.' + name; + } + prepended += destructuring + ';\n'; + } + if (opts._with !== false) { + prepended += ' with (' + opts.localsName + ' || {}) {' + '\n'; + appended += ' }' + '\n'; + } + appended += ' return __output;' + '\n'; + this.source = prepended + this.source + appended; + } + + if (opts.compileDebug) { + src = 'var __line = 1' + '\n' + + ' , __lines = ' + JSON.stringify(this.templateText) + '\n' + + ' , __filename = ' + (opts.filename ? + JSON.stringify(opts.filename) : 'undefined') + ';' + '\n' + + 'try {' + '\n' + + this.source + + '} catch (e) {' + '\n' + + ' rethrow(e, __lines, __filename, __line, escapeFn);' + '\n' + + '}' + '\n'; + } + else { + src = this.source; + } + + if (opts.client) { + src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src; + if (opts.compileDebug) { + src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src; + } + } + + if (opts.strict) { + src = '"use strict";\n' + src; + } + if (opts.debug) { + console.log(src); + } + if (opts.compileDebug && opts.filename) { + src = src + '\n' + + '//# sourceURL=' + opts.filename + '\n'; + } + + try { + if (opts.async) { + // Have to use generated function for this, since in envs without support, + // it breaks in parsing + try { + ctor = (new Function('return (async function(){}).constructor;'))(); + } + catch(e) { + if (e instanceof SyntaxError) { + throw new Error('This environment does not support async/await'); + } + else { + throw e; + } + } + } + else { + ctor = Function; + } + fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src); + } + catch(e) { + // istanbul ignore else + if (e instanceof SyntaxError) { + if (opts.filename) { + e.message += ' in ' + opts.filename; + } + e.message += ' while compiling ejs\n\n'; + e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n'; + e.message += 'https://github.com/RyanZim/EJS-Lint'; + if (!opts.async) { + e.message += '\n'; + e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.'; + } + } + throw e; + } + + // Return a callable function which will execute the function + // created by the source-code, with the passed data as locals + // Adds a local `include` function which allows full recursive include + var returnedFn = opts.client ? fn : function anonymous(data) { + var include = function (path, includeData) { + var d = utils.shallowCopy({}, data); + if (includeData) { + d = utils.shallowCopy(d, includeData); + } + return includeFile(path, opts)(d); + }; + return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]); + }; + if (opts.filename && typeof Object.defineProperty === 'function') { + var filename = opts.filename; + var basename = path.basename(filename, path.extname(filename)); + try { + Object.defineProperty(returnedFn, 'name', { + value: basename, + writable: false, + enumerable: false, + configurable: true + }); + } catch (e) {/* ignore */} + } + return returnedFn; + }, + + generateSource: function () { + var opts = this.opts; + + if (opts.rmWhitespace) { + // Have to use two separate replace here as `^` and `$` operators don't + // work well with `\r` and empty lines don't work well with the `m` flag. + this.templateText = + this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, ''); + } + + // Slurp spaces and tabs before <%_ and after _%> + this.templateText = + this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>'); + + var self = this; + var matches = this.parseTemplateText(); + var d = this.opts.delimiter; + var o = this.opts.openDelimiter; + var c = this.opts.closeDelimiter; + + if (matches && matches.length) { + matches.forEach(function (line, index) { + var closing; + // If this is an opening tag, check for closing tags + // FIXME: May end up with some false positives here + // Better to store modes as k/v with openDelimiter + delimiter as key + // Then this can simply check against the map + if ( line.indexOf(o + d) === 0 // If it is a tag + && line.indexOf(o + d + d) !== 0) { // and is not escaped + closing = matches[index + 2]; + if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) { + throw new Error('Could not find matching close tag for "' + line + '".'); + } + } + self.scanLine(line); + }); + } + + }, + + parseTemplateText: function () { + var str = this.templateText; + var pat = this.regex; + var result = pat.exec(str); + var arr = []; + var firstPos; + + while (result) { + firstPos = result.index; + + if (firstPos !== 0) { + arr.push(str.substring(0, firstPos)); + str = str.slice(firstPos); + } + + arr.push(result[0]); + str = str.slice(result[0].length); + result = pat.exec(str); + } + + if (str) { + arr.push(str); + } + + return arr; + }, + + _addOutput: function (line) { + if (this.truncate) { + // Only replace single leading linebreak in the line after + // -%> tag -- this is the single, trailing linebreak + // after the tag that the truncation mode replaces + // Handle Win / Unix / old Mac linebreaks -- do the \r\n + // combo first in the regex-or + line = line.replace(/^(?:\r\n|\r|\n)/, ''); + this.truncate = false; + } + if (!line) { + return line; + } + + // Preserve literal slashes + line = line.replace(/\\/g, '\\\\'); + + // Convert linebreaks + line = line.replace(/\n/g, '\\n'); + line = line.replace(/\r/g, '\\r'); + + // Escape double-quotes + // - this will be the delimiter during execution + line = line.replace(/"/g, '\\"'); + this.source += ' ; __append("' + line + '")' + '\n'; + }, + + scanLine: function (line) { + var self = this; + var d = this.opts.delimiter; + var o = this.opts.openDelimiter; + var c = this.opts.closeDelimiter; + var newLineCount = 0; + + newLineCount = (line.split('\n').length - 1); + + switch (line) { + case o + d: + case o + d + '_': + this.mode = Template.modes.EVAL; + break; + case o + d + '=': + this.mode = Template.modes.ESCAPED; + break; + case o + d + '-': + this.mode = Template.modes.RAW; + break; + case o + d + '#': + this.mode = Template.modes.COMMENT; + break; + case o + d + d: + this.mode = Template.modes.LITERAL; + this.source += ' ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n'; + break; + case d + d + c: + this.mode = Template.modes.LITERAL; + this.source += ' ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n'; + break; + case d + c: + case '-' + d + c: + case '_' + d + c: + if (this.mode == Template.modes.LITERAL) { + this._addOutput(line); + } + + this.mode = null; + this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0; + break; + default: + // In script mode, depends on type of tag + if (this.mode) { + // If '//' is found without a line break, add a line break. + switch (this.mode) { + case Template.modes.EVAL: + case Template.modes.ESCAPED: + case Template.modes.RAW: + if (line.lastIndexOf('//') > line.lastIndexOf('\n')) { + line += '\n'; + } + } + switch (this.mode) { + // Just executing code + case Template.modes.EVAL: + this.source += ' ; ' + line + '\n'; + break; + // Exec, esc, and output + case Template.modes.ESCAPED: + this.source += ' ; __append(escapeFn(' + stripSemi(line) + '))' + '\n'; + break; + // Exec and output + case Template.modes.RAW: + this.source += ' ; __append(' + stripSemi(line) + ')' + '\n'; + break; + case Template.modes.COMMENT: + // Do nothing + break; + // Literal <%% mode, append as raw output + case Template.modes.LITERAL: + this._addOutput(line); + break; + } + } + // In string mode, just add the output + else { + this._addOutput(line); + } + } + + if (self.opts.compileDebug && newLineCount) { + this.currentLine += newLineCount; + this.source += ' ; __line = ' + this.currentLine + '\n'; + } + } +}; + +/** + * Escape characters reserved in XML. + * + * This is simply an export of {@link module:utils.escapeXML}. + * + * If `markup` is `undefined` or `null`, the empty string is returned. + * + * @param {String} markup Input string + * @return {String} Escaped string + * @public + * @func + * */ +exports.escapeXML = utils.escapeXML; + +/** + * Express.js support. + * + * This is an alias for {@link module:ejs.renderFile}, in order to support + * Express.js out-of-the-box. + * + * @func + */ + +exports.__express = exports.renderFile; + +/** + * Version of EJS. + * + * @readonly + * @type {String} + * @public + */ + +exports.VERSION = _VERSION_STRING; + +/** + * Name for detection of EJS. + * + * @readonly + * @type {String} + * @public + */ + +exports.name = _NAME; + +/* istanbul ignore if */ +if (typeof window != 'undefined') { + window.ejs = exports; +} + +},{"../package.json":6,"./utils":2,"fs":3,"path":4}],2:[function(require,module,exports){ +/* + * EJS Embedded JavaScript templates + * Copyright 2112 Matthew Eernisse (mde@fleegix.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * +*/ + +/** + * Private utility functions + * @module utils + * @private + */ + +'use strict'; + +var regExpChars = /[|\\{}()[\]^$+*?.]/g; + +/** + * Escape characters reserved in regular expressions. + * + * If `string` is `undefined` or `null`, the empty string is returned. + * + * @param {String} string Input string + * @return {String} Escaped string + * @static + * @private + */ +exports.escapeRegExpChars = function (string) { + // istanbul ignore if + if (!string) { + return ''; + } + return String(string).replace(regExpChars, '\\$&'); +}; + +var _ENCODE_HTML_RULES = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' +}; +var _MATCH_HTML = /[&<>'"]/g; + +function encode_char(c) { + return _ENCODE_HTML_RULES[c] || c; +} + +/** + * Stringified version of constants used by {@link module:utils.escapeXML}. + * + * It is used in the process of generating {@link ClientFunction}s. + * + * @readonly + * @type {String} + */ + +var escapeFuncStr = + 'var _ENCODE_HTML_RULES = {\n' ++ ' "&": "&"\n' ++ ' , "<": "<"\n' ++ ' , ">": ">"\n' ++ ' , \'"\': """\n' ++ ' , "\'": "'"\n' ++ ' }\n' ++ ' , _MATCH_HTML = /[&<>\'"]/g;\n' ++ 'function encode_char(c) {\n' ++ ' return _ENCODE_HTML_RULES[c] || c;\n' ++ '};\n'; + +/** + * Escape characters reserved in XML. + * + * If `markup` is `undefined` or `null`, the empty string is returned. + * + * @implements {EscapeCallback} + * @param {String} markup Input string + * @return {String} Escaped string + * @static + * @private + */ + +exports.escapeXML = function (markup) { + return markup == undefined + ? '' + : String(markup) + .replace(_MATCH_HTML, encode_char); +}; +exports.escapeXML.toString = function () { + return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr; +}; + +/** + * Naive copy of properties from one object to another. + * Does not recurse into non-scalar properties + * Does not check to see if the property has a value before copying + * + * @param {Object} to Destination object + * @param {Object} from Source object + * @return {Object} Destination object + * @static + * @private + */ +exports.shallowCopy = function (to, from) { + from = from || {}; + for (var p in from) { + to[p] = from[p]; + } + return to; +}; + +/** + * Naive copy of a list of key names, from one object to another. + * Only copies property if it is actually defined + * Does not recurse into non-scalar properties + * + * @param {Object} to Destination object + * @param {Object} from Source object + * @param {Array} list List of properties to copy + * @return {Object} Destination object + * @static + * @private + */ +exports.shallowCopyFromList = function (to, from, list) { + for (var i = 0; i < list.length; i++) { + var p = list[i]; + if (typeof from[p] != 'undefined') { + to[p] = from[p]; + } + } + return to; +}; + +/** + * Simple in-process cache implementation. Does not implement limits of any + * sort. + * + * @implements {Cache} + * @static + * @private + */ +exports.cache = { + _data: {}, + set: function (key, val) { + this._data[key] = val; + }, + get: function (key) { + return this._data[key]; + }, + remove: function (key) { + delete this._data[key]; + }, + reset: function () { + this._data = {}; + } +}; + +/** + * Transforms hyphen case variable into camel case. + * + * @param {String} string Hyphen case string + * @return {String} Camel case string + * @static + * @private + */ +exports.hyphenToCamel = function (str) { + return str.replace(/-[a-z]/g, function (match) { return match[1].toUpperCase(); }); +}; + +},{}],3:[function(require,module,exports){ + +},{}],4:[function(require,module,exports){ +(function (process){ +// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1, +// backported and transplited with Babel, with backwards-compat fixes + +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function (path) { + if (typeof path !== 'string') path = path + ''; + if (path.length === 0) return '.'; + var code = path.charCodeAt(0); + var hasRoot = code === 47 /*/*/; + var end = -1; + var matchedSlash = true; + for (var i = path.length - 1; i >= 1; --i) { + code = path.charCodeAt(i); + if (code === 47 /*/*/) { + if (!matchedSlash) { + end = i; + break; + } + } else { + // We saw the first non-path separator + matchedSlash = false; + } + } + + if (end === -1) return hasRoot ? '/' : '.'; + if (hasRoot && end === 1) { + // return '//'; + // Backwards-compat fix: + return '/'; + } + return path.slice(0, end); +}; + +function basename(path) { + if (typeof path !== 'string') path = path + ''; + + var start = 0; + var end = -1; + var matchedSlash = true; + var i; + + for (i = path.length - 1; i >= 0; --i) { + if (path.charCodeAt(i) === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + start = i + 1; + break; + } + } else if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // path component + matchedSlash = false; + end = i + 1; + } + } + + if (end === -1) return ''; + return path.slice(start, end); +} + +// Uses a mixed approach for backwards-compatibility, as ext behavior changed +// in new Node.js versions, so only basename() above is backported here +exports.basename = function (path, ext) { + var f = basename(path); + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + +exports.extname = function (path) { + if (typeof path !== 'string') path = path + ''; + var startDot = -1; + var startPart = 0; + var end = -1; + var matchedSlash = true; + // Track the state of characters (if any) we see before our first dot and + // after any path separator we find + var preDotState = 0; + for (var i = path.length - 1; i >= 0; --i) { + var code = path.charCodeAt(i); + if (code === 47 /*/*/) { + // If we reached a path separator that was not part of a set of path + // separators at the end of the string, stop now + if (!matchedSlash) { + startPart = i + 1; + break; + } + continue; + } + if (end === -1) { + // We saw the first non-path separator, mark this as the end of our + // extension + matchedSlash = false; + end = i + 1; + } + if (code === 46 /*.*/) { + // If this is our first dot, mark it as the start of our extension + if (startDot === -1) + startDot = i; + else if (preDotState !== 1) + preDotState = 1; + } else if (startDot !== -1) { + // We saw a non-dot and non-path separator before our dot, so we should + // have a good chance at having a non-empty extension + preDotState = -1; + } + } + + if (startDot === -1 || end === -1 || + // We saw a non-dot character immediately before the dot + preDotState === 0 || + // The (right-most) trimmed path component is exactly '..' + preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) { + return ''; + } + return path.slice(startDot, end); +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":5}],5:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],6:[function(require,module,exports){ +module.exports={ + "name": "ejs", + "description": "Embedded JavaScript templates", + "keywords": [ + "template", + "engine", + "ejs" + ], + "version": "3.1.5", + "author": "Matthew Eernisse (http://fleegix.org)", + "license": "Apache-2.0", + "bin": { + "ejs": "./bin/cli.js" + }, + "main": "./lib/ejs.js", + "jsdelivr": "ejs.min.js", + "unpkg": "ejs.min.js", + "repository": { + "type": "git", + "url": "git://github.com/mde/ejs.git" + }, + "bugs": "https://github.com/mde/ejs/issues", + "homepage": "https://github.com/mde/ejs", + "dependencies": { + "jake": "^10.6.1" + }, + "devDependencies": { + "browserify": "^16.5.1", + "eslint": "^6.8.0", + "git-directory-deploy": "^1.5.1", + "jsdoc": "^3.6.4", + "lru-cache": "^4.0.1", + "mocha": "^7.1.1", + "uglify-js": "^3.3.16" + }, + "engines": { + "node": ">=0.10.0" + }, + "scripts": { + "test": "mocha" + } +} + +},{}]},{},[1])(1) +}); diff --git a/front-src/overlay/libs/socket.io.js b/front-src/overlay/libs/socket.io.js new file mode 100644 index 00000000..b7fe98fc --- /dev/null +++ b/front-src/overlay/libs/socket.io.js @@ -0,0 +1,3 @@ +import io from "../../libs/socket.io"; + +export const { on, emit } = io("/overlay"); diff --git a/overlay-src/overlay.js b/front-src/overlay/overlay.js similarity index 78% rename from overlay-src/overlay.js rename to front-src/overlay/overlay.js index f896b16b..976f892c 100644 --- a/overlay-src/overlay.js +++ b/front-src/overlay/overlay.js @@ -4,13 +4,12 @@ import { createElementFromTarget } from "@/components/Anime/Timeline/libs/create import getStyle from "@/components/Anime/Timeline/libs/getStyle"; import getTrans from "@/components/Anime/Timeline/libs/getTrans"; -import io from "socket.io-client"; +import { loadUsedFonts, loadFont } from "../libs/fonts"; +import { on } from "./libs/socket.io"; import animejs from "animejs"; +import ejs from "./libs/ejs"; -const socket = io("/overlay", { - transports: ["websocket"], - upgrade: false, -}); +(async () => await loadUsedFonts(false))(); const playables = ["audio", "video"]; @@ -21,9 +20,6 @@ function runAnime(action, cb) { const timeline = animejs.timeline({ autoplay: false, - // update() { - // console.log((this.duration / 100) * this.progress); - // }, complete() { $anime.remove(); cb({ success: true, action }); @@ -37,11 +33,14 @@ function runAnime(action, cb) { createElementFromTarget(item.target).then((element) => { const style = getStyle(item.target.style); const trans = getTrans(item.target.trans); + element.setAttribute("id", `item-${item.id}`); element.setAttribute("style", `${style};${trans}`); + Object.entries(item.target.attrs).forEach(([key, val]) => { element.setAttribute(key, val); }); + element.style.position = "absolute"; const targets = element; @@ -69,6 +68,14 @@ function runAnime(action, cb) { } ); + if (element.innerText !== "") { + Object.entries(action.eventProps).forEach(([key, val]) => { + const regexp = new RegExp(`\\$${key}`, "g"); + element.innerText = element.innerText.replace(regexp, val); + }); + element.innerHTML = ejs.render(element.innerText, action.eventProps); + } + return element; }) ); @@ -83,13 +90,15 @@ function runAnime(action, cb) { timeline.play(); }) .catch((error) => { - cb({ error, action }); + cb({ error: error.stack, action }); $anime.remove(); }); } -socket.on("actions.start", (action, cb) => { +on("actions.start", (action, cb) => { if (action.type === "anime") { runAnime(action, cb); } }); + +on("loadFont", (url) => loadFont(url, false)); diff --git a/package.json b/package.json index 83f201cb..e8e2c06f 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,55 @@ { "name": "marv", - "version": "0.3.3", + "version": "1.4.1", "description": "Marv - Twitch Bot", "repository": "github:skarab42/marv", "author": "skarab42 ", "license": "MIT", "scripts": { + "postinstall": "electron-builder install-app-deps", "app:watch": "electron app/main/index.js -w", "app:build": "electron-builder build", "client:watch": "rollup -c -w", "client:build": "rollup -c", "tailwind:build": "node tailwind/build.js", "start": "electron app/main/index.js", - "watch": "concurrently -k -n client,app -c magenta,yellow \"yarn client:watch\" \"yarn app:watch\"", - "build": "yarn tailwind:build --prod && yarn client:build", - "prettify": "prettier --write ./app ./client-src", - "lint": "eslint ./app ./client-src --fix && yarn prettify" + "watch": "concurrently -k -n tailwind,client,app -c red,magenta,yellow \"yarn tailwind:build\" \"yarn client:watch\" \"yarn app:watch\"", + "build": "yarn client:build && yarn tailwind:build --prod", + "prettify": "prettier --write ./app ./front-src", + "lint": "eslint ./app ./front-src --fix && yarn prettify", + "change": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0", + "commit": "cz" }, "build": { "productName": "Marv", - "icon": "app/static/icon.png" + "icon": "app/static/icon.png", + "linux": { + "category": "Streaming" + } + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } }, "devDependencies": { "@rollup/plugin-alias": "^3.1.1", "@rollup/plugin-commonjs": "^15.1.0", + "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^9.0.0", "animejs": "^3.2.1", + "axios": "^0.21.1", "capitalize": "^2.0.3", + "chalk": "^4.1.0", "clone-deep": "^4.0.1", + "codemirror": "^5.59.2", + "compare-versions": "^3.6.0", "concurrently": "^5.3.0", - "electron": "^10.1.5", + "conventional-changelog-cli": "^2.1.1", + "cz-conventional-changelog": "3.3.0", + "electron": "^11.0.3", "electron-builder": "^22.9.1", + "electron-rebuild": "^2.3.2", "eslint": "^7.12.0", "eslint-plugin-svelte3": "^2.7.3", "i18next": "^19.8.3", @@ -44,12 +63,14 @@ "rollup-plugin-svelte": "^6.1.0", "rollup-plugin-svelte-svg": "^0.2.3", "rollup-plugin-terser": "^7.0.2", - "simplebar": "^5.3.0", + "sequelize-cli": "^6.2.0", "socket.io-client": "^2.3.1", "svelte": "^3.29.4", "svelte-color": "https://github.com/skarab42/svelte-color.git", "svelte-grid": "1.11.0", "svelte-icons": "^2.1.0", + "svelte-portal": "^2.1.1", + "sveltejs-tippy": "^3.0.0", "tailwindcss": "^1.9.6", "throttle-debounce": "^3.0.1", "uuid": "^8.3.1" diff --git a/rollup.config.js b/rollup.config.js index 4e97cde8..79263aae 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -7,14 +7,17 @@ import cleaner from "rollup-plugin-cleaner"; import svelte from "rollup-plugin-svelte"; import alias from "@rollup/plugin-alias"; import css from "rollup-plugin-css-only"; +import json from "@rollup/plugin-json"; const watch = process.env.ROLLUP_WATCH; -const clientDir = "client-src"; -const overlayDir = "overlay-src"; +const frontDir = "front-src"; const publicDir = "app/client"; + const jsDir = `${publicDir}/js`; const cssDir = `${publicDir}/css`; +const clientDir = `${frontDir}/client`; +const overlayDir = `${frontDir}/overlay`; export default { input: [`${clientDir}/index.js`, `${overlayDir}/overlay.js`], @@ -24,6 +27,7 @@ export default { sourcemap: true, }, plugins: [ + json(), alias({ entries: [{ find: "@", replacement: `${__dirname}/${clientDir}` }], }), diff --git a/tailwind/build.js b/tailwind/build.js index fd9cd6f6..022bdcee 100644 --- a/tailwind/build.js +++ b/tailwind/build.js @@ -4,12 +4,33 @@ const tailwind = require.resolve("tailwindcss/lib/cli.js"); const { fork } = require("child_process"); +const chalk = require("chalk"); const path = require("path"); +const colors = new chalk.Instance({ level: 3 }); const config = path.resolve(__dirname, "config.js"); const input = path.resolve(__dirname, "index.css"); const output = path.resolve(__dirname, "../app/static/css/tailwind.css"); const argv = [...process.argv.slice(2), "--no-autoprefixer"]; const args = ["build", input, "-c", config, "-o", output, ...argv]; -fork(tailwind, args, { stdio: ["inherit", "inherit", "inherit", "ipc"] }); +function build() { + fork(tailwind, args, { stdio: ["inherit", "inherit", "inherit", "ipc"] }); +} + +build(); + +if (!process.argv.includes("--prod")) { + const icon = colors.green("↺"); + const chokidar = require("chokidar"); + const watcher = chokidar.watch(__dirname); + const rootPath = path.resolve(__dirname, "../.."); + + watcher.on("ready", () => { + watcher.on("change", (source) => { + // eslint-disable-next-line no-console + console.log(`${icon} file changed: ${path.relative(rootPath, source)}`); + build(); + }); + }); +} diff --git a/tailwind/config.js b/tailwind/config.js index ae38117f..2bc73890 100644 --- a/tailwind/config.js +++ b/tailwind/config.js @@ -1,16 +1,31 @@ const colors = require("./colors"); -const purge = process.argv.includes("--prod"); - module.exports = { + future: { + purgeLayersByDefault: true, + removeDeprecatedGapUtilities: true, + }, purge: { - enabled: purge, - content: ["app/client/**/*.html", "app/client/**/*.js"], + enabled: process.argv.includes("--prod"), + content: ["front-src/**/*.svelte", "front-src/**/*.js"], + options: { + whitelistPatterns: [/^rounded-/], + }, }, theme: { extend: { colors, }, + borderRadius: { + none: "0", + sm: "2px", + default: "4px", + md: "8px", + lg: "16px", + xl: "42px", + half: "50%", + full: "100%", + }, }, variants: {}, plugins: [], diff --git a/tailwind/index.css b/tailwind/index.css index 3e60b2ff..b3eca916 100644 --- a/tailwind/index.css +++ b/tailwind/index.css @@ -7,4 +7,48 @@ input[type=file]::-webkit-file-upload-button { cursor: pointer; } +input:focus { + outline: 0; +} + +[data-tippy-root] { + z-index: 49 !important; +} + +.tippy-box[data-theme~="marv"] { + background-color: tomato; + color: yellow; +} + +.tippy-box[data-theme~="marv"][data-placement^="top"] > .tippy-arrow::before { + border-top-color: tomato; +} + +.tippy-box[data-theme~="marv"][data-placement^="bottom"] + > .tippy-arrow::before { + border-bottom-color: tomato; +} + +/* + The emerging W3C standard that is currently Firefox-only + Source: https://www.digitalocean.com/community/tutorials/css-scrollbars +*/ +* { + scrollbar-width: thin; + scrollbar-color: rgba(0, 0, 0, 0.4) transparent; +} + +/* Works on Chrome/Edge/Safari */ +*::-webkit-scrollbar { + width: 6px; +} +*::-webkit-scrollbar-track { + background: transparent; +} +*::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, 0.4); + border-radius: 20px; + border: 5px solid transparent; +} + @import "tailwindcss/utilities"; diff --git a/yarn.lock b/yarn.lock index c776e59a..b7d46368 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,6 +35,39 @@ dependencies: regenerator-runtime "^0.13.4" +"@commitlint/execute-rule@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" + integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== + +"@commitlint/load@>6.1.1": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" + integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== + dependencies: + "@commitlint/execute-rule" "^11.0.0" + "@commitlint/resolve-extends" "^11.0.0" + "@commitlint/types" "^11.0.0" + chalk "4.1.0" + cosmiconfig "^7.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + +"@commitlint/resolve-extends@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" + integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== + dependencies: + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/types@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" + integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== + "@develar/schema-utils@~2.6.5": version "2.6.5" resolved "https://registry.yarnpkg.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz#3ece22c5838402419a6e0425f85742b961d9b6c6" @@ -83,6 +116,18 @@ postcss "7.0.32" purgecss "^2.3.0" +"@malept/cross-spawn-promise@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.0.tgz#258fde4098f5004a56db67c35f33033af64810f6" + integrity sha512-GeIK5rfU1Yd7BZJQPTGZMMmcZy5nhRToPXZcjaDwQDRSewdhp648GT2E4dh+L7+Io7AOW6WQ+GR44QSzja4qxg== + dependencies: + cross-spawn "^7.0.1" + +"@popperjs/core@^2.1.0": + version "2.5.4" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.5.4.tgz#de25b5da9f727985a3757fd59b5d028aba75841a" + integrity sha512-ZpKr+WTb8zsajqgDkvCEWgp6d5eJT6Q63Ng2neTbzBO76Lbe91vX/iVIW9dikq+Fs3yEo+ls4cxeXABD2LtcbQ== + "@rollup/plugin-alias@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.1.tgz#bb96cf37fefeb0a953a6566c284855c7d1cd290c" @@ -103,6 +148,13 @@ magic-string "^0.25.7" resolve "^1.17.0" +"@rollup/plugin-json@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" + integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@rollup/plugin-node-resolve@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz#39bd0034ce9126b39c1699695f440b4b7d2b62e6" @@ -115,7 +167,7 @@ is-module "^1.0.0" resolve "^1.17.0" -"@rollup/pluginutils@^3.0.0", "@rollup/pluginutils@^3.1.0": +"@rollup/pluginutils@^3.0.0", "@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== @@ -129,6 +181,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@sindresorhus/is@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" + integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== + "@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" @@ -136,6 +193,23 @@ dependencies: defer-to-connect "^1.0.1" +"@szmarczak/http-timer@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" + integrity sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ== + dependencies: + defer-to-connect "^2.0.0" + +"@types/cacheable-request@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" + integrity sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/debug@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd" @@ -158,6 +232,23 @@ dependencies: "@types/node" "*" +"@types/http-cache-semantics@*": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" + integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== + +"@types/keyv@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" + integrity sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw== + dependencies: + "@types/node" "*" + +"@types/minimist@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256" + integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg== + "@types/node@*": version "14.14.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.2.tgz#d25295f9e4ca5989a2c610754dc02a9721235eeb" @@ -168,6 +259,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.1.tgz#303f74c8a2b35644594139e948b2be470ae1186f" integrity sha512-/xaVmBBjOGh55WCqumLAHXU9VhjGtmyTGqJzFBXRWZzByOXI5JAJNx9xPVGEsNizrNwcec92fQMj458MWfjN1A== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -175,6 +276,13 @@ dependencies: "@types/node" "*" +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -187,6 +295,19 @@ dependencies: "@types/yargs-parser" "*" +JSONStream@^1.0.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +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-jsx@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -211,6 +332,11 @@ acorn@^7.0.0, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +add-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" + integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -221,7 +347,7 @@ ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -248,6 +374,21 @@ ansi-colors@^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@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^2.0.0, ansi-regex@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" @@ -313,6 +454,19 @@ app-builder-lib@22.9.1: semver "^7.3.2" temp-file "^3.3.7" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -320,11 +474,63 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -345,11 +551,21 @@ async@0.9.x: resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= +asynckit@^0.4.0: + version "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.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + autoprefixer@^9.4.5: version "9.8.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" @@ -363,6 +579,23 @@ autoprefixer@^9.4.5: postcss "^7.0.32" postcss-value-parser "^4.1.0" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" @@ -378,6 +611,26 @@ base64-arraybuffer@0.1.4: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + binary-extensions@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" @@ -395,7 +648,7 @@ bluebird-lst@^1.0.9: dependencies: bluebird "^3.5.5" -bluebird@^3.5.5: +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== @@ -427,6 +680,22 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -492,6 +761,26 @@ bytes@^3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz#049fdc59dffdd4fc285e8f4f82936591bd59fec3" + integrity sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w== + cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -505,6 +794,24 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" +cacheable-request@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" + integrity sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^2.0.0" + +cachedir@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" + integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -515,16 +822,33 @@ camelcase-css@^2.0.1: resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -can-use-dom@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a" - integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo= - caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001135: version "1.0.30001151" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001151.tgz#1ddfde5e6fff02aad7940b4edb7d3ac76b0cb00b" @@ -535,6 +859,19 @@ capitalize@^2.0.3: resolved "https://registry.yarnpkg.com/capitalize/-/capitalize-2.0.3.tgz#ccfeb1046d2a054eb30f34af907a70c3e90f3b73" integrity sha512-Qc5ksT1/zEJBbFYD05h99hCNEW0cgyD0zzE5WvkgisNnppJ+16zfaSk34evF0j6pGW8hejkRUeygJ5uN5k22SQ== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@4.1.0, "chalk@^3.0.0 || ^4.0.0", chalk@^4.0.0, chalk@^4.1.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@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -552,13 +889,10 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -"chalk@^3.0.0 || ^4.0.0", chalk@^4.0.0, chalk@^4.1.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" +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@^3.3.0: version "3.4.3" @@ -575,6 +909,16 @@ chokidar@^3.3.0: optionalDependencies: fsevents "~2.1.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + 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" @@ -585,11 +929,57 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cli-boxes@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== +cli-color@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.4.0.tgz#7d10738f48526824f8fe7da51857cb0f572fe01f" + integrity sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w== + dependencies: + ansi-regex "^2.1.1" + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + memoizee "^0.4.14" + timers-ext "^0.1.5" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" + integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -624,6 +1014,29 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +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= + +codemirror@^5.59.2: + version "5.59.2" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.59.2.tgz#ee674d3a4a8d241af38d52afc482625ba7393922" + integrity sha512-/D5PcsKyzthtSy2NNKCyJi3b+htRkoKv3idswR/tR6UAvMNKA7SrmyZy6fOONJxSRs1JlUWEDAbxqfdArbK8iA== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -669,7 +1082,19 @@ colorette@^1.2.1: resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== -commander@^2.20.0: +colors@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + 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" + +commander@^2.19.0, 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== @@ -679,17 +1104,50 @@ commander@^5.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commitizen@^4.0.3: + version "4.2.2" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.2.2.tgz#1a93dd07208521ea1ebbf832593542dac714cc79" + integrity sha512-uz+E6lGsDBDI2mYA4QfOxFeqdWUYwR1ky11YmLgg2BnEEP3YbeejpT4lxzGjkYqumnXr062qTOGavR9NtX/iwQ== + dependencies: + cachedir "2.2.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.0.0" + find-node-modules "2.0.0" + find-root "1.1.0" + fs-extra "8.1.0" + glob "7.1.4" + inquirer "6.5.2" + is-utf8 "^0.2.1" + lodash "^4.17.20" + minimist "1.2.5" + strip-bom "4.0.0" + strip-json-comments "3.0.1" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= -component-emitter@~1.3.0: +component-emitter@^1.2.1, 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== @@ -729,7 +1187,7 @@ concurrently@^5.3.0: tree-kill "^1.2.2" yargs "^13.3.0" -config-chain@^1.1.11: +config-chain@^1.1.11, config-chain@^1.1.12: 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== @@ -749,17 +1207,201 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -core-js@^3.0.1, core-js@^3.6.5: +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +conventional-changelog-angular@^5.0.12: + version "5.0.12" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" + integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-atom@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz#a759ec61c22d1c1196925fca88fe3ae89fd7d8de" + integrity sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw== + dependencies: + q "^1.5.1" + +conventional-changelog-cli@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-2.1.1.tgz#7a11980bc399938e0509d2adf8e7a0e213eb994e" + integrity sha512-xMGQdKJ+4XFDDgfX5aK7UNFduvJMbvF5BB+g0OdVhA3rYdYyhctrIE2Al+WYdZeKTdg9YzMWF2iFPT8MupIwng== + dependencies: + add-stream "^1.0.0" + conventional-changelog "^3.1.24" + lodash "^4.17.15" + meow "^8.0.0" + tempfile "^3.0.0" + +conventional-changelog-codemirror@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz#398e9530f08ce34ec4640af98eeaf3022eb1f7dc" + integrity sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw== + dependencies: + q "^1.5.1" + +conventional-changelog-conventionalcommits@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz#a02e0b06d11d342fdc0f00c91d78265ed0bc0a62" + integrity sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw== + dependencies: + compare-func "^2.0.0" + lodash "^4.17.15" + q "^1.5.1" + +conventional-changelog-core@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.2.tgz#f0897df6d53b5d63dec36b9442bd45354f8b3ce5" + integrity sha512-7pDpRUiobQDNkwHyJG7k9f6maPo9tfPzkSWbRq97GGiZqisElhnvUZSvyQH20ogfOjntB5aadvv6NNcKL1sReg== + dependencies: + add-stream "^1.0.0" + conventional-changelog-writer "^4.0.18" + conventional-commits-parser "^3.2.0" + dateformat "^3.0.0" + get-pkg-repo "^1.0.0" + git-raw-commits "^2.0.8" + git-remote-origin-url "^2.0.0" + git-semver-tags "^4.1.1" + lodash "^4.17.15" + normalize-package-data "^3.0.0" + q "^1.5.1" + read-pkg "^3.0.0" + read-pkg-up "^3.0.0" + shelljs "^0.8.3" + through2 "^4.0.0" + +conventional-changelog-ember@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz#619b37ec708be9e74a220f4dcf79212ae1c92962" + integrity sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A== + dependencies: + q "^1.5.1" + +conventional-changelog-eslint@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz#689bd0a470e02f7baafe21a495880deea18b7cdb" + integrity sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA== + dependencies: + q "^1.5.1" + +conventional-changelog-express@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz#420c9d92a347b72a91544750bffa9387665a6ee8" + integrity sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ== + dependencies: + q "^1.5.1" + +conventional-changelog-jquery@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz#d142207400f51c9e5bb588596598e24bba8994bf" + integrity sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw== + dependencies: + q "^1.5.1" + +conventional-changelog-jshint@^2.0.9: + version "2.0.9" + resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz#f2d7f23e6acd4927a238555d92c09b50fe3852ff" + integrity sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA== + dependencies: + compare-func "^2.0.0" + q "^1.5.1" + +conventional-changelog-preset-loader@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" + integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== + +conventional-changelog-writer@^4.0.18: + version "4.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz#1ca7880b75aa28695ad33312a1f2366f4b12659f" + integrity sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw== + dependencies: + compare-func "^2.0.0" + conventional-commits-filter "^2.0.7" + dateformat "^3.0.0" + handlebars "^4.7.6" + json-stringify-safe "^5.0.1" + lodash "^4.17.15" + meow "^8.0.0" + semver "^6.0.0" + split "^1.0.0" + through2 "^4.0.0" + +conventional-changelog@^3.1.24: + version "3.1.24" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.24.tgz#ebd180b0fd1b2e1f0095c4b04fd088698348a464" + integrity sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg== + dependencies: + conventional-changelog-angular "^5.0.12" + conventional-changelog-atom "^2.0.8" + conventional-changelog-codemirror "^2.0.8" + conventional-changelog-conventionalcommits "^4.5.0" + conventional-changelog-core "^4.2.1" + conventional-changelog-ember "^2.0.9" + conventional-changelog-eslint "^3.0.9" + conventional-changelog-express "^2.0.6" + conventional-changelog-jquery "^3.0.11" + conventional-changelog-jshint "^2.0.9" + conventional-changelog-preset-loader "^2.3.4" + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +conventional-commits-filter@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" + integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== + dependencies: + lodash.ismatch "^4.4.0" + modify-values "^1.0.0" + +conventional-commits-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz#9e261b139ca4b7b29bcebbc54460da36894004ca" + integrity sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ== + dependencies: + JSONStream "^1.0.4" + is-text-path "^1.0.1" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^2.0.0" + through2 "^4.0.0" + trim-off-newlines "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +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-util-is@~1.0.0: +core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-spawn@^7.0.2: +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^7.0.1, 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== @@ -783,18 +1425,71 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + +cz-conventional-changelog@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + date-fns@^2.0.1: version "2.16.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.1.tgz#05775792c3f3331da812af253e1a935851d3834b" integrity sha512-sAJVKx/FqrLYHAQeN7VpJrPhagZc9R4ImZIWYRFZaaohR3KzmuK88touwsSwSVT8Qcbd4zoDsnGfX4GFB4imyQ== -debug@^2.6.9: +dateformat@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" + integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== + +debug@^2.2.0, debug@^2.3.3, 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.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" @@ -816,11 +1511,24 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.2.0: +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -828,6 +1536,18 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -843,11 +1563,23 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + 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== +defer-to-connect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" + integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -855,10 +1587,57 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + +detect-libc@^1.0.2, detect-libc@^1.0.3: + version "1.0.3" + 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" @@ -893,7 +1672,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^5.2.0: +dot-prop@^5.1.0, dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== @@ -915,6 +1694,24 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== + dependencies: + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" + ejs@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.5.tgz#aed723844dc20acb4b170cd9ab1017e476a0d93b" @@ -956,15 +1753,33 @@ electron-publish@22.9.1: lazy-val "^1.0.4" mime "^2.4.6" +electron-rebuild@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-2.3.2.tgz#42da553a1e4e844ae4d3c3b97e42be836b2924b3" + integrity sha512-VLd3iIn65PmYWmvL+nx0oKspbohkDUhCAz8I2EWbMJcOFzWKW1UXJZ+ZG53iEDJFldm9PahE4q2Bx3ns4bdzeQ== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + colors "^1.3.3" + debug "^4.1.1" + detect-libc "^1.0.3" + fs-extra "^9.0.1" + got "^11.7.0" + lzma-native "^6.0.1" + node-abi "^2.19.1" + node-gyp "^7.1.0" + ora "^5.1.0" + tar "^6.0.5" + yargs "^16.0.0" + electron-to-chromium@^1.3.571: version "1.3.583" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.583.tgz#47a9fde74740b1205dba96db2e433132964ba3ee" integrity sha512-L9BwLwJohjZW9mQESI79HRzhicPk1DFgM+8hOCfGgGCFEcA3Otpv7QK6SGtYoZvfQfE3wKLh0Hd5ptqUFv3gvQ== -electron@^10.1.5: - version "10.1.5" - resolved "https://registry.yarnpkg.com/electron/-/electron-10.1.5.tgz#f2b161310f627063e73fbac44efcb35dece83a90" - integrity sha512-fys/KnEfJq05TtMij+lFvLuKkuVH030CHYx03iZrW5DNNLwjE6cW3pysJ420lB0FRSfPjTHBMu2eVCf5TG71zQ== +electron@^11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/electron/-/electron-11.0.3.tgz#c29eaacda38ce561890e59906ca5f507c72b3ec4" + integrity sha512-nNfbLi7Q1xfJXOEO2adck5TS6asY4Jxc332E4Te8XfQ9hcaC3GiCdeEqk9FndNCwxhJA5Lr9jfSGRTwWebFa/w== dependencies: "@electron/get" "^1.0.1" "@types/node" "^12.0.12" @@ -1032,18 +1847,54 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" +es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + 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-iterator@^2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +es6-weak-map@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + escalade@^3.1.0, escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -1200,6 +2051,84 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +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" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extract-zip@^1.0.3: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -1210,6 +2139,16 @@ extract-zip@^1.0.3: mkdirp "^0.5.4" yauzl "^2.10.0" +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + 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" @@ -1232,6 +2171,13 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + 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" @@ -1246,6 +2192,16 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.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" @@ -1253,6 +2209,34 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-node-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" + integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== + dependencies: + findup-sync "^3.0.0" + merge "^1.2.1" + +find-root@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + 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" @@ -1260,6 +2244,24 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -1274,7 +2276,38 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -fs-extra@^8.0.0, fs-extra@^8.1.0: +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-extra@8.1.0, fs-extra@^8.0.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== @@ -1283,6 +2316,15 @@ fs-extra@^8.0.0, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.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@^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" @@ -1293,6 +2335,20 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^1.0.0" +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1313,11 +2369,41 @@ 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= +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-pkg-repo@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" + integrity sha1-xztInAbYDMVTbCyFP54FIyBWly0= + dependencies: + hosted-git-info "^2.1.4" + meow "^3.3.0" + normalize-package-data "^2.3.0" + parse-github-repo-url "^1.3.0" + through2 "^2.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= + get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -1332,6 +2418,52 @@ get-stream@^5.1.0: 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" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +git-raw-commits@^2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.9.tgz#5cbc707a615cb77b71e687f8a1ee54af46208b22" + integrity sha512-hSpNpxprVno7IOd4PZ93RQ+gNdzPAIrW0x8av6JQDJGV4k1mR9fE01dl8sEqi2P7aKmmwiGUn1BCPuf16Ae0Qw== + dependencies: + dargs "^7.0.0" + lodash.template "^4.0.2" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= + dependencies: + gitconfiglocal "^1.0.0" + pify "^2.3.0" + +git-semver-tags@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" + integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== + dependencies: + meow "^8.0.0" + semver "^6.0.0" + +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= + dependencies: + ini "^1.3.2" + 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" @@ -1339,7 +2471,19 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6: +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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" + +glob@^7.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== @@ -1364,6 +2508,13 @@ global-agent@^2.0.2: semver "^7.3.2" serialize-error "^7.0.1" +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + global-dirs@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" @@ -1371,6 +2522,26 @@ global-dirs@^2.0.1: dependencies: ini "^1.3.5" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + 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" @@ -1395,6 +2566,23 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" +got@^11.7.0: + version "11.8.0" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.0.tgz#be0920c3586b07fd94add3b5b27cb28f49e6545f" + integrity sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -1412,11 +2600,41 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +handlebars@^4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +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.12.3" + har-schema "^2.0.0" + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" @@ -1439,6 +2657,42 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" @@ -1451,12 +2705,19 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== -hosted-git-info@^3.0.5: +hosted-git-info@^3.0.5, hosted-git-info@^3.0.6: version "3.0.7" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.7.tgz#a30727385ea85acfcee94e0aad9e368c792e036c" integrity sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ== @@ -1473,6 +2734,23 @@ http-cache-semantics@^4.0.0: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.0-beta.5.2" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3" + integrity sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + i18next-http-backend@^1.0.21: version "1.0.21" resolved "https://registry.yarnpkg.com/i18next-http-backend/-/i18next-http-backend-1.0.21.tgz#cee901b3527dad5165fa91de973b6aa6404c1c37" @@ -1487,6 +2765,13 @@ i18next@^19.8.3: dependencies: "@babel/runtime" "^7.12.0" +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" @@ -1494,6 +2779,13 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -1517,6 +2809,18 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= + dependencies: + repeating "^2.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -1540,10 +2844,53 @@ inherits@2, inherits@^2.0.3, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.2: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + ini@^1.3.4, ini@^1.3.5, 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.7" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84" + integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + +inquirer@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -1562,6 +2909,11 @@ is-binary-path@~2.1.0: 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" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -1576,11 +2928,74 @@ is-core-module@^2.0.0: dependencies: has "^1.0.3" +is-core-module@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + dependencies: + has "^1.0.3" + +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" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^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" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -1606,6 +3021,11 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -1616,6 +3036,13 @@ is-npm@^4.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1631,13 +3058,23 @@ is-path-inside@^3.0.1: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== -is-plain-object@^2.0.4: +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" +is-promise@^2.1: + 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-reference@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -1645,26 +3082,43 @@ is-reference@^1.2.1: dependencies: "@types/estree" "*" -is-typedarray@^1.0.0: +is-text-path@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" + integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= + dependencies: + text-extensions "^1.0.0" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" +is-utf8@^0.2.0, is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + isarray@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isbinaryfile@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" @@ -1675,11 +3129,23 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^3.0.1: +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + jake@^10.6.1: version "10.8.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.2.tgz#ebc9de8558160a66d82d0eadc6a2e58fbc500a7b" @@ -1699,6 +3165,17 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" +js-beautify@^1.8.8: + version "1.13.0" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.0.tgz#a056d5d3acfd4918549aae3ab039f9f3c51eebb2" + integrity sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA== + dependencies: + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + mkdirp "^1.0.4" + nopt "^5.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" @@ -1712,27 +3189,47 @@ js-yaml@^3.13.1, js-yaml@^3.14.0: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: 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-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + json-stable-stringify-without-jsonify@^1.0.1: version "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= @@ -1760,6 +3257,21 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + keyv@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" @@ -1767,7 +3279,33 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -kind-of@^6.0.2: +keyv@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254" + integrity sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA== + dependencies: + json-buffer "3.0.1" + +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" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -1792,6 +3330,11 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + livereload-js@^3.1.0: version "3.3.1" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.3.1.tgz#61f887468086762e61fb2987412cf9d1dda99202" @@ -1807,6 +3350,35 @@ livereload@^0.9.1: opts ">= 1.2.0" ws "^6.2.1" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -1815,31 +3387,73 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.throttle@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" - integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= +lodash.ismatch@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" + integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.template@^4.0.2: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: +lodash@^4.17.10, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== +log-symbols@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" + integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g= + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.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" @@ -1850,6 +3464,14 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -1857,6 +3479,23 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-queue@0.1: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" + integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + dependencies: + es5-ext "~0.10.2" + +lzma-native@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/lzma-native/-/lzma-native-6.0.1.tgz#eec231d31b9f9ba5aea5afc86326669f01dedb58" + integrity sha512-O6oWF0xe1AFvOCjU8uOZBZ/lhjaMNwHfVNaqVMqmoQXlRwBcFWpCAToiZOdXcKVMdo/5s/D0a2QgA5laMErxHQ== + dependencies: + node-addon-api "^1.6.0" + node-pre-gyp "^0.11.0" + readable-stream "^2.3.5" + rimraf "^2.7.1" + magic-string@^0.25.7: version "0.25.7" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" @@ -1871,6 +3510,28 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + matcher@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" @@ -1878,21 +3539,124 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +memoizee@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" + integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== + dependencies: + d "1" + es5-ext "^0.10.45" + es6-weak-map "^2.0.2" + event-emitter "^0.3.5" + is-promise "^2.1" + lru-queue "0.1" + next-tick "1" + timers-ext "^0.1.5" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +micromatch@^3.0.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +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.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.44.0" + mime@^2.4.6: version "2.4.6" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + 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== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@^3.0.2, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -1900,33 +3664,153 @@ minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@1.2.5, minimist@^1.1.1, 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== -mkdirp@^0.5.1, mkdirp@^0.5.4: +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.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" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1, 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: minimist "^1.2.5" +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +modify-values@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" + integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.2: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +needle@^2.2.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.5.2.tgz#cf1a8fce382b5a280108bba90a14993c00e4010a" + integrity sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +node-abi@^2.19.1: + version "2.19.3" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.3.tgz#252f5dcab12dad1b5503b2d27eddd4733930282d" + integrity sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg== + dependencies: + semver "^5.4.1" + +node-addon-api@^1.6.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" + integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== + node-emoji@^1.8.1: version "1.10.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" @@ -1939,12 +3823,59 @@ node-fetch@2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-releases@^1.1.61: version "1.1.64" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.64.tgz#71b4ae988e9b1dd7c1ffce58dd9e561752dfebc5" integrity sha512-Iec8O9166/x2HRMJyLLLWkd0sFFLrFNy+Xf+JQfSQsdBJzPcHpNl3JQ9gD4j+aJxmCa25jNsIbM4bmACtSbkSg== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +nopt@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -1954,6 +3885,16 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" + integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== + dependencies: + hosted-git-info "^3.0.6" + resolve "^1.17.0" + semver "^7.3.2" + validate-npm-package-license "^3.0.1" + 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" @@ -1974,6 +3915,13 @@ normalize.css@^8.0.1: resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + npm-conf@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" @@ -1982,16 +3930,59 @@ npm-conf@^1.1.3: config-chain "^1.1.11" pify "^3.0.0" +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + +npmlog@^4.0.2, npmlog@^4.1.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== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= -object-assign@^4.1.1: +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-hash@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" @@ -2002,6 +3993,20 @@ object-keys@^1.0.12: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2009,6 +4014,20 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -2026,18 +4045,69 @@ optionator@^0.9.1: resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== +ora@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.1.0.tgz#b188cf8cd2d4d9b13fd25383bc3e5cba352c94f8" + integrity sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w== + dependencies: + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.4.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" + wcwidth "^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= + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + 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-limit@^2.0.0: +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0, p-limit@^2.2.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" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + 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" @@ -2045,6 +4115,18 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-try@^1.0.0: + version "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" @@ -2067,6 +4149,18 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-github-repo-url@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" + integrity sha1-nn2LslKmy2ukJZUGC3v23z28H1A= + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -2075,6 +4169,21 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" @@ -2085,11 +4194,28 @@ parseuri@0.0.6: resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2105,21 +4231,69 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +performance-now@^2.1.0: + version "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.2.1, picomatch@^2.2.2: 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" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +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= + postcss-functions@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-functions/-/postcss-functions-3.0.0.tgz#0e94d01444700a481de20de4d55fb2640564250e" @@ -2233,6 +4407,16 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +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.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -2241,7 +4425,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -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== @@ -2263,6 +4447,26 @@ purgecss@^2.3.0: postcss "7.0.32" postcss-selector-parser "^6.0.2" +q@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -2270,7 +4474,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -rc@^1.2.8: +rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -2291,6 +4495,49 @@ read-config-file@6.0.0: json5 "^2.1.2" lazy-val "^1.0.4" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" @@ -2300,7 +4547,26 @@ read-pkg@^4.0.1: parse-json "^4.0.0" pify "^3.0.0" -readable-stream@^2.2.2: +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@3, readable-stream@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.5, readable-stream@~2.3.6: 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== @@ -2320,6 +4586,29 @@ readdirp@~3.5.0: dependencies: picomatch "^2.2.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + reduce-css-calc@^2.1.6: version "2.1.7" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz#1ace2e02c286d78abcd01fd92bfe8097ab0602c2" @@ -2333,6 +4622,14 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpp@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" @@ -2352,6 +4649,49 @@ registry-url@^5.0.0: dependencies: rc "^1.2.8" +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + +request@^2.88.2: + 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" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -2367,16 +4707,49 @@ require-relative@^0.8.7: resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== +resolve-alpn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" + integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" 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-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +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.5.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" @@ -2392,6 +4765,34 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" +responselike@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" + integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + rimraf@2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -2399,13 +4800,20 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.6.3: +rimraf@^2.6.1, rimraf@^2.6.3, rimraf@^2.7.1: 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" + roarr@^2.15.3: version "2.15.4" resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -2488,14 +4896,19 @@ rollup@^2.32.1: optionalDependencies: fsevents "~2.1.2" -rxjs@^6.5.2: +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== + +rxjs@^6.4.0, rxjs@^6.5.2: version "6.6.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== dependencies: tslib "^1.9.0" -safe-buffer@^5.1.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2505,7 +4918,14 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3.0.0": +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"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== @@ -2534,7 +4954,7 @@ semver-diff@^3.1.1: dependencies: semver "^6.3.0" -"semver@2 || 3 || 4 || 5": +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -2549,6 +4969,19 @@ semver@^7.2.1, semver@^7.3.2: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +sequelize-cli@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/sequelize-cli/-/sequelize-cli-6.2.0.tgz#fd02bfeae23b8226872f9947f3f8212cc49a4771" + integrity sha512-6WQ2x91hg30dUn66mXHnzvHATZ4pyI1GHSNbS/TNN/vRR4BLRSLijadeMgC8zqmKDsL0VqzVVopJWfJakuP++Q== + dependencies: + cli-color "^1.4.0" + fs-extra "^7.0.1" + js-beautify "^1.8.8" + lodash "^4.17.5" + resolve "^1.5.0" + umzug "^2.3.0" + yargs "^13.1.0" + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -2563,11 +4996,21 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -set-blocking@^2.0.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-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -2587,7 +5030,21 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.2: +shelljs@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= + +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -2599,18 +5056,6 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -simplebar@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/simplebar/-/simplebar-5.3.0.tgz#857de63296401ed0c3026845514fe5db69795be5" - integrity sha512-LgrGdIWpwHLLlI9HqfnGql62H/iZlF0KDZ7w3ZNbd2ZLwh9NKsODLHPzQgUlqQ8aZe7Y6/1xJMXK1PU5e810+w== - dependencies: - can-use-dom "^0.1.0" - core-js "^3.0.1" - lodash.debounce "^4.0.8" - lodash.memoize "^4.1.2" - lodash.throttle "^4.1.1" - resize-observer-polyfill "^1.5.1" - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2625,6 +5070,36 @@ slice-ansi@^2.1.0: astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + socket.io-client@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.1.tgz#91a4038ef4d03c19967bb3c646fec6e0eaa78cff" @@ -2651,6 +5126,17 @@ socket.io-parser@~3.3.0: debug "~3.1.0" isarray "2.0.1" +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@^0.5.19, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -2659,6 +5145,16 @@ source-map-support@^0.5.19, source-map-support@~0.5.19: 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" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -2705,6 +5201,34 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +split2@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" + integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== + dependencies: + through2 "^2.0.2" + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -2715,11 +5239,51 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stat-mode@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", 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== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -2738,6 +5302,13 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -2745,6 +5316,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -2759,6 +5344,42 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= + dependencies: + get-stdin "^4.0.1" + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -2813,11 +5434,23 @@ svelte-icons@^2.1.0: resolved "https://registry.yarnpkg.com/svelte-icons/-/svelte-icons-2.1.0.tgz#6f2ec72f1d5c8b2de1a4b8a822c95bcb2f701aca" integrity sha512-rHPQjweEc9fGSnvM0/4gA3pDHwyZyYsC5KhttCZRhSMJfLttJST5Uq0B16Czhw+HQ+HbSOk8kLigMlPs7gZtfg== +svelte-portal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/svelte-portal/-/svelte-portal-2.1.1.tgz#7285d19cffffc25bd1d28f98fb5d8173643c326d" + integrity sha512-B61Bem/3cqgPGVMRM09RhEmZKBGbv3EFVO15GWbFWltNy9dN6sdLK5rV5VEOdZRDNaqgYai9caCHMDuYMpW/1w== + svelte@^3.29.4: version "3.29.4" resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.29.4.tgz#d0f80cb58109ef52963855c23496f7153bb2eb7e" integrity sha512-oW0fGHlyFFMvzRtIvOs84b0fOc0gmZNQcL5Is3hxuTpvaYX3pfd8oHy4KnOvbq4Ca6SG6AHdRMk7OhApTo0NqA== +sveltejs-tippy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/sveltejs-tippy/-/sveltejs-tippy-3.0.0.tgz#2594b4664325655a6e87e9a975c766e0e348e882" + integrity sha512-LAfQikm61AeqZW1hCFWUsmGEMmhMHDvrPV0JhbT38Ell9SqBjmFaY//+YKUxaJvx6nLMxGQdlcHA1rDg2Ml8tQ== + dependencies: + tippy.js "~6.0.1" + table@^5.2.3: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -2856,6 +5489,36 @@ tailwindcss@^1.9.6: reduce-css-calc "^2.1.6" resolve "^1.14.2" +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +tar@^6.0.2, tar@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" + integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + temp-file@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.3.7.tgz#686885d635f872748e384e871855958470aeb18a" @@ -2864,6 +5527,14 @@ temp-file@^3.3.7: async-exit-hook "^2.0.1" fs-extra "^8.1.0" +tempfile@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-3.0.0.tgz#5376a3492de7c54150d0cc0612c3f00e2cdaf76c" + integrity sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw== + dependencies: + temp-dir "^2.0.0" + uuid "^3.3.2" + term-size@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" @@ -2878,6 +5549,11 @@ terser@^5.0.0: source-map "~0.7.2" source-map-support "~0.5.19" +text-extensions@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" + integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -2888,21 +5564,78 @@ throttle-debounce@^3.0.1: resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-3.0.1.tgz#32f94d84dfa894f786c9a1f290e7a645b6a19abb" integrity sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== +through2@^2.0.0, through2@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +through@2, "through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +timers-ext@^0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.7.tgz#6f57ad8578e07a3fb9f91d9387d65647555e25c6" + integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ== + dependencies: + es5-ext "~0.10.46" + next-tick "1" + tinycolor2@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA== +tippy.js@~6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-6.0.3.tgz#caf7730132c41b835a0cc41d698f4e2858a10f3c" + integrity sha512-buQF6HugTA4YeSA/s9xBhu0ferEAx7sRSn45G+Juh3p+Dz3vEKfxtqdg6JUnHIWDCV/r0u8Lrobs9AB4dtYcUQ== + dependencies: + "@popperjs/core" "^2.1.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + 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" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + 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" @@ -2910,11 +5643,44 @@ to-regex-range@^5.0.1: 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" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +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: + psl "^1.1.28" + punycode "^2.1.1" + tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +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-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + +trim-off-newlines@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" + integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= + truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" @@ -2927,11 +5693,23 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + 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.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" @@ -2944,11 +5722,31 @@ type-fest@^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.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + 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== +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -2961,6 +5759,28 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +uglify-js@^3.1.4: + version "3.12.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.12.4.tgz#93de48bb76bb3ec0fc36563f871ba46e2ee5c7ee" + integrity sha512-L5i5jg/SHkEqzN18gQMTWsZk3KelRsfD1wUVNqtq0kzqWQqcJjyL8yc1o8hJgRrWqrAl2mUFbhfznEIoi7zi2A== + +umzug@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.3.0.tgz#0ef42b62df54e216b05dcaf627830a6a8b84a184" + integrity sha512-Z274K+e8goZK8QJxmbRPhl89HPO1K+ORFtm6rySPhFKfKc5GHhqdzD0SGhSWHkzoXasqJuItdhorSvY7/Cgflw== + dependencies: + bluebird "^3.7.2" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" @@ -2983,6 +5803,14 @@ universalify@^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" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + update-notifier@^4.1.1: version "4.1.3" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3" @@ -3009,6 +5837,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -3016,16 +5849,26 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + utf8-byte-length@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E= -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.1: version "8.3.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" @@ -3044,18 +5887,48 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^2.0.1: +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: 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" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -3063,11 +5936,16 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -word-wrap@^1.2.3: +word-wrap@^1.0.3, 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== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -3132,7 +6010,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.2: +xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== @@ -3147,11 +6025,31 @@ y18n@^5.0.2: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.4.tgz#0ab2db89dd5873b5ec4682d8e703e833373ea897" integrity sha512-deLOfD+RvFgrpAmSZgfGdWYE+OKyHcVHaRQ7NphG/63scpRvTHHeQMAxGGvaLVGJ+HYVcCXlzcTK0ZehFf+eHQ== +y18n@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -3165,7 +6063,12 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.3.tgz#92419ba867b858c868acf8bae9bf74af0dd0ce26" integrity sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww== -yargs@^13.3.0: +yargs-parser@^20.2.3: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs@^13.1.0, yargs@^13.3.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -3181,6 +6084,19 @@ yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@^16.0.0: + version "16.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.1.tgz#5a4a095bd1ca806b0a50d0c03611d38034d219a1" + integrity sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^16.0.3: version "16.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.0.tgz#fc333fe4791660eace5a894b39d42f851cd48f2a"