[READ-ONLY] Mirror of https://github.com/maybeanerd/MagiBot. MagiBot - the community building discord bot that adds joinsounds to your voice channels! discord.gg/2Evcf4T
bot bots community discord gaming hacktoberfest sound
1

Configure Feed

Select the types of activity you want to include in your feed.

Truncated history

Sebastian Di Luzio (Apr 7, 2022, 8:26 PM +0200) 98e93bfd

+10340
+4
.env
··· 1 + TOKEN= 2 + OWNERID= 3 + PREFIX= 4 + DATABASE_URL=
+39
.eslintrc.js
··· 1 + module.exports = { 2 + root: true, 3 + plugins: ['@typescript-eslint', 'import'], 4 + extends: ['eslint:recommended', 'airbnb'], 5 + rules: { 6 + 'import/no-unresolved': 'error', //maybe we do not need this 7 + 'import/prefer-default-export': 'off', 8 + '@typescript-eslint/no-unused-vars': 'error', 9 + 'no-extra-semi': 0, 10 + semi: 2, 11 + indent: ['warn', 2], 12 + quotes: [ 13 + 'error', 14 + 'single', 15 + { 16 + allowTemplateLiterals: false, 17 + avoidEscape: true 18 + } 19 + ], 20 + camelcase: 0, //'warn', 21 + 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 22 + 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 23 + 'no-plusplus': 0, 24 + 'no-useless-constructor': 'off', // TS has some issues with this, so we use their check 25 + '@typescript-eslint/no-useless-constructor': 'error', 26 + 'import/extensions':0 27 + }, 28 + parser: '@typescript-eslint/parser', 29 + settings: { 30 + 'import/parsers': { 31 + '@typescript-eslint/parser': ['.ts', '.tsx'] 32 + }, 33 + 'import/resolver': { 34 + // use <root>/tsconfig.json 35 + node: {}, 36 + typescript: {} 37 + } 38 + } 39 + };
+38
.github/ISSUE_TEMPLATE/bug_report.md
··· 1 + --- 2 + name: Bug report 3 + about: Create a report to help us improve 4 + title: '' 5 + labels: '' 6 + assignees: '' 7 + 8 + --- 9 + 10 + **Describe the bug** 11 + A clear and concise description of what the bug is. 12 + 13 + **To Reproduce** 14 + Steps to reproduce the behavior: 15 + 1. Go to '...' 16 + 2. Click on '....' 17 + 3. Scroll down to '....' 18 + 4. See error 19 + 20 + **Expected behavior** 21 + A clear and concise description of what you expected to happen. 22 + 23 + **Screenshots** 24 + If applicable, add screenshots to help explain your problem. 25 + 26 + **Desktop (please complete the following information):** 27 + - OS: [e.g. iOS] 28 + - Browser [e.g. chrome, safari] 29 + - Version [e.g. 22] 30 + 31 + **Smartphone (please complete the following information):** 32 + - Device: [e.g. iPhone6] 33 + - OS: [e.g. iOS8.1] 34 + - Browser [e.g. stock browser, safari] 35 + - Version [e.g. 22] 36 + 37 + **Additional context** 38 + Add any other context about the problem here.
+20
.github/ISSUE_TEMPLATE/feature_request.md
··· 1 + --- 2 + name: Feature request 3 + about: Create an issue for a feature 4 + title: '' 5 + labels: '' 6 + assignees: '' 7 + 8 + --- 9 + 10 + **Is your feature request related to a problem? Please describe.** 11 + A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 + 13 + **Describe the solution you'd like** 14 + A clear and concise description of what you want to happen. 15 + 16 + **Describe alternatives you've considered** 17 + A clear and concise description of any alternative solutions or features you've considered. 18 + 19 + **Additional context** 20 + Add any other context or screenshots about the feature request here.
+25
.github/workflows/nodejs.yml
··· 1 + name: Node CI 2 + 3 + on: [push] 4 + 5 + jobs: 6 + build: 7 + 8 + runs-on: ubuntu-latest 9 + 10 + strategy: 11 + matrix: 12 + node-version: [10.x] 13 + 14 + steps: 15 + - uses: actions/checkout@v1 16 + - name: Use Node.js ${{ matrix.node-version }} 17 + uses: actions/setup-node@v1 18 + with: 19 + node-version: ${{ matrix.node-version }} 20 + - name: npm install, build, and test 21 + run: | 22 + npm install 23 + npm run lint --if-present 24 + npm run build --if-present 25 + npm run test --if-present
+291
.gitignore
··· 1 + ## Ignore Visual Studio temporary files, build results, and 2 + ## files generated by popular Visual Studio add-ons. 3 + ## 4 + ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 + 6 + # User-specific files 7 + *.suo 8 + *.user 9 + *.userosscache 10 + *.sln.docstates 11 + 12 + # User-specific files (MonoDevelop/Xamarin Studio) 13 + *.userprefs 14 + 15 + # Build results 16 + [Dd]ebug/ 17 + [Dd]ebugPublic/ 18 + [Rr]elease/ 19 + [Rr]eleases/ 20 + x64/ 21 + x86/ 22 + bld/ 23 + [Bb]in/ 24 + [Oo]bj/ 25 + [Ll]og/ 26 + 27 + # Visual Studio 2015 cache/options directory 28 + .vs/ 29 + # Uncomment if you have tasks that create the project's static files in wwwroot 30 + #wwwroot/ 31 + 32 + # MSTest test Results 33 + [Tt]est[Rr]esult*/ 34 + [Bb]uild[Ll]og.* 35 + 36 + # NUNIT 37 + *.VisualState.xml 38 + TestResult.xml 39 + 40 + # Build Results of an ATL Project 41 + [Dd]ebugPS/ 42 + [Rr]eleasePS/ 43 + dlldata.c 44 + 45 + # .NET Core 46 + project.lock.json 47 + project.fragment.lock.json 48 + artifacts/ 49 + **/Properties/launchSettings.json 50 + 51 + *_i.c 52 + *_p.c 53 + *_i.h 54 + *.ilk 55 + *.meta 56 + *.obj 57 + *.pch 58 + *.pdb 59 + *.pgc 60 + *.pgd 61 + *.rsp 62 + *.sbr 63 + *.tlb 64 + *.tli 65 + *.tlh 66 + *.tmp 67 + *.tmp_proj 68 + *.log 69 + *.vspscc 70 + *.vssscc 71 + .builds 72 + *.pidb 73 + *.svclog 74 + *.scc 75 + 76 + # Chutzpah Test files 77 + _Chutzpah* 78 + 79 + # Visual C++ cache files 80 + ipch/ 81 + *.aps 82 + *.ncb 83 + *.opendb 84 + *.opensdf 85 + *.sdf 86 + *.cachefile 87 + *.VC.db 88 + *.VC.VC.opendb 89 + 90 + # Visual Studio profiler 91 + *.psess 92 + *.vsp 93 + *.vspx 94 + *.sap 95 + 96 + # TFS 2012 Local Workspace 97 + $tf/ 98 + 99 + # Guidance Automation Toolkit 100 + *.gpState 101 + 102 + # ReSharper is a .NET coding add-in 103 + _ReSharper*/ 104 + *.[Rr]e[Ss]harper 105 + *.DotSettings.user 106 + 107 + # JustCode is a .NET coding add-in 108 + .JustCode 109 + 110 + # TeamCity is a build add-in 111 + _TeamCity* 112 + 113 + # DotCover is a Code Coverage Tool 114 + *.dotCover 115 + 116 + # Visual Studio code coverage results 117 + *.coverage 118 + *.coveragexml 119 + 120 + # NCrunch 121 + _NCrunch_* 122 + .*crunch*.local.xml 123 + nCrunchTemp_* 124 + 125 + # MightyMoose 126 + *.mm.* 127 + AutoTest.Net/ 128 + 129 + # Web workbench (sass) 130 + .sass-cache/ 131 + 132 + # Installshield output folder 133 + [Ee]xpress/ 134 + 135 + # DocProject is a documentation generator add-in 136 + DocProject/buildhelp/ 137 + DocProject/Help/*.HxT 138 + DocProject/Help/*.HxC 139 + DocProject/Help/*.hhc 140 + DocProject/Help/*.hhk 141 + DocProject/Help/*.hhp 142 + DocProject/Help/Html2 143 + DocProject/Help/html 144 + 145 + # Click-Once directory 146 + publish/ 147 + 148 + # Publish Web Output 149 + *.[Pp]ublish.xml 150 + *.azurePubxml 151 + # TODO: Comment the next line if you want to checkin your web deploy settings 152 + # but database connection strings (with potential passwords) will be unencrypted 153 + *.pubxml 154 + *.publishproj 155 + 156 + # Microsoft Azure Web App publish settings. Comment the next line if you want to 157 + # checkin your Azure Web App publish settings, but sensitive information contained 158 + # in these scripts will be unencrypted 159 + PublishScripts/ 160 + 161 + # NuGet Packages 162 + *.nupkg 163 + # The packages folder can be ignored because of Package Restore 164 + **/packages/* 165 + # except build/, which is used as an MSBuild target. 166 + !**/packages/build/ 167 + # Uncomment if necessary however generally it will be regenerated when needed 168 + #!**/packages/repositories.config 169 + # NuGet v3's project.json files produces more ignorable files 170 + *.nuget.props 171 + *.nuget.targets 172 + 173 + # Microsoft Azure Build Output 174 + csx/ 175 + *.build.csdef 176 + 177 + # Microsoft Azure Emulator 178 + ecf/ 179 + rcf/ 180 + 181 + # Windows Store app package directories and files 182 + AppPackages/ 183 + BundleArtifacts/ 184 + Package.StoreAssociation.xml 185 + _pkginfo.txt 186 + 187 + # Visual Studio cache files 188 + # files ending in .cache can be ignored 189 + *.[Cc]ache 190 + # but keep track of directories ending in .cache 191 + !*.[Cc]ache/ 192 + 193 + # Others 194 + ClientBin/ 195 + ~$* 196 + *~ 197 + *.dbmdl 198 + *.dbproj.schemaview 199 + *.jfm 200 + *.pfx 201 + *.publishsettings 202 + orleans.codegen.cs 203 + 204 + # Since there are multiple workflows, uncomment next line to ignore bower_components 205 + # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 206 + #bower_components/ 207 + 208 + # RIA/Silverlight projects 209 + Generated_Code/ 210 + 211 + # Backup & report files from converting an old project file 212 + # to a newer Visual Studio version. Backup files are not needed, 213 + # because we have git ;-) 214 + _UpgradeReport_Files/ 215 + Backup*/ 216 + UpgradeLog*.XML 217 + UpgradeLog*.htm 218 + 219 + # SQL Server files 220 + *.mdf 221 + *.ldf 222 + *.ndf 223 + 224 + # Business Intelligence projects 225 + *.rdl.data 226 + *.bim.layout 227 + *.bim_*.settings 228 + 229 + # Microsoft Fakes 230 + FakesAssemblies/ 231 + 232 + # GhostDoc plugin setting file 233 + *.GhostDoc.xml 234 + 235 + # Node.js Tools for Visual Studio 236 + .ntvs_analysis.dat 237 + node_modules/ 238 + 239 + # Typescript v1 declaration files 240 + typings/ 241 + 242 + # Visual Studio 6 build log 243 + *.plg 244 + 245 + # Visual Studio 6 workspace options file 246 + *.opt 247 + 248 + # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 249 + *.vbw 250 + 251 + # Visual Studio LightSwitch build output 252 + **/*.HTMLClient/GeneratedArtifacts 253 + **/*.DesktopClient/GeneratedArtifacts 254 + **/*.DesktopClient/ModelManifest.xml 255 + **/*.Server/GeneratedArtifacts 256 + **/*.Server/ModelManifest.xml 257 + _Pvt_Extensions 258 + 259 + # Paket dependency manager 260 + .paket/paket.exe 261 + paket-files/ 262 + 263 + # FAKE - F# Make 264 + .fake/ 265 + 266 + # JetBrains Rider 267 + .idea/ 268 + *.sln.iml 269 + 270 + # CodeRush 271 + .cr/ 272 + 273 + # Python Tools for Visual Studio (PTVS) 274 + __pycache__/ 275 + *.pyc 276 + 277 + # Cake - Uncomment if you are using it 278 + # tools/** 279 + # !tools/packages.config 280 + 281 + # Telerik's JustMock configuration file 282 + *.jmconfig 283 + 284 + # BizTalk build output 285 + *.btp.cs 286 + *.btm.cs 287 + *.odx.cs 288 + *.xsd.cs 289 + startForLinAMI.txt 290 + startForWin.txt 291 + # src/token.ts
+32
.vscode/settings.json
··· 1 + { 2 + "git.ignoreLimitWarning": true, 3 + "files.eol": "\n", 4 + "javascript.preferences.quoteStyle": "single", 5 + "typescript.preferences.quoteStyle": "single", 6 + "eslint.validate": [ 7 + { 8 + "language": "typescript", 9 + "autoFix": true 10 + }, 11 + { 12 + "language": "javascript", 13 + "autoFix": true 14 + } 15 + ], 16 + "eslint.autoFixOnSave": true, 17 + "editor.formatOnSave": false, 18 + "vetur.validation.template": false, 19 + "vetur.format.defaultFormatterOptions": { 20 + "prettier": { 21 + "semi": true, 22 + "singleQuote": true 23 + } 24 + }, 25 + "prettier.singleQuote": true, 26 + "prettier.endOfLine": "lf", 27 + "typescript.tsdk": "node_modules/typescript/lib", 28 + "editor.tabSize": 2, 29 + "editor.codeActionsOnSave": { 30 + "source.fixAll.eslint": true 31 + } 32 + }
+1
CODEOWNERS
··· 1 + * @T0TProduction
+4
README.md
··· 1 + Libraries used: 2 + discord.js: https://github.com/hydrabolt/discord.js/#installation 3 + based on nihilist's template: https://github.com/nihilist/paul 4 + using MongoDB: https://www.mongodb.com/
+1
docs/_config.yml
··· 1 + theme: jekyll-theme-slate
+7
docs/index.html
··· 1 + <!DOCTYPE html> 2 + <html> 3 + <body> 4 + <h1>MagiBot</h1> 5 + <p>this site is currently under construction...</p> 6 + </body> 7 + </html>
+5679
package-lock.json
··· 1 + { 2 + "name": "magibot", 3 + "version": "3.0.0", 4 + "lockfileVersion": 1, 5 + "requires": true, 6 + "dependencies": { 7 + "@babel/code-frame": { 8 + "version": "7.8.3", 9 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 10 + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 11 + "dev": true, 12 + "requires": { 13 + "@babel/highlight": "^7.8.3" 14 + } 15 + }, 16 + "@babel/highlight": { 17 + "version": "7.8.3", 18 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", 19 + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", 20 + "dev": true, 21 + "requires": { 22 + "chalk": "^2.0.0", 23 + "esutils": "^2.0.2", 24 + "js-tokens": "^4.0.0" 25 + } 26 + }, 27 + "@babel/runtime": { 28 + "version": "7.7.6", 29 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.6.tgz", 30 + "integrity": "sha512-BWAJxpNVa0QlE5gZdWjSxXtemZyZ9RmrmVozxt3NUXeZhVIJ5ANyqmMc0JDrivBZyxUuQvFxlvH4OWWOogGfUw==", 31 + "dev": true, 32 + "requires": { 33 + "regenerator-runtime": "^0.13.2" 34 + } 35 + }, 36 + "@babel/runtime-corejs3": { 37 + "version": "7.7.6", 38 + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.7.6.tgz", 39 + "integrity": "sha512-NrRUehqG0sMSCaP+0XV/vOvvjNl4BQOWq3Qys1Q2KTEm5tGMo9h0dHnIzeKerj0a7SIB8LP5kYg/T1raE3FoKQ==", 40 + "dev": true, 41 + "requires": { 42 + "core-js-pure": "^3.0.0", 43 + "regenerator-runtime": "^0.13.2" 44 + } 45 + }, 46 + "@discordjs/collection": { 47 + "version": "0.1.5", 48 + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.5.tgz", 49 + "integrity": "sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw==" 50 + }, 51 + "@discordjs/opus": { 52 + "version": "0.1.0", 53 + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.1.0.tgz", 54 + "integrity": "sha512-VWsrsgqSktxOEHx9SFcnOWJhYQOsyzaW3JVN73LDSzKrycEjtRIS+axlm4qeMGx60u6RH1SY15b3pl5G4+Y+gA==", 55 + "optional": true, 56 + "requires": { 57 + "node-addon-api": "^2.0.0", 58 + "node-pre-gyp": "^0.14.0" 59 + }, 60 + "dependencies": { 61 + "node-addon-api": { 62 + "version": "2.0.0", 63 + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", 64 + "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==", 65 + "optional": true 66 + } 67 + } 68 + }, 69 + "@types/bson": { 70 + "version": "4.0.1", 71 + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.1.tgz", 72 + "integrity": "sha512-K6VAEdLVJFBxKp8m5cRTbUfeZpuSvOuLKJLrgw9ANIXo00RiyGzgH4BKWWR4F520gV4tWmxG7q9sKQRVDuzrBw==", 73 + "requires": { 74 + "@types/node": "*" 75 + } 76 + }, 77 + "@types/color-name": { 78 + "version": "1.1.1", 79 + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 80 + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 81 + "dev": true 82 + }, 83 + "@types/eslint-visitor-keys": { 84 + "version": "1.0.0", 85 + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 86 + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", 87 + "dev": true 88 + }, 89 + "@types/ffprobe-static": { 90 + "version": "2.0.0", 91 + "resolved": "https://registry.npmjs.org/@types/ffprobe-static/-/ffprobe-static-2.0.0.tgz", 92 + "integrity": "sha512-rjyutd/DyrjuWqux7oswuH9kox71HjvlSTO0TKW+tqQVcP3RN570D/G/vzy41/KSZe3NAaOJvxkHXnAxaHAjdg==" 93 + }, 94 + "@types/json-schema": { 95 + "version": "7.0.4", 96 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", 97 + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", 98 + "dev": true 99 + }, 100 + "@types/json5": { 101 + "version": "0.0.29", 102 + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", 103 + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", 104 + "dev": true 105 + }, 106 + "@types/mongodb": { 107 + "version": "3.5.2", 108 + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.5.2.tgz", 109 + "integrity": "sha512-/p4+HjfQqmNtq88rlLJ9XgUROhmbdUEU0yeVPCPIt8/vA1fSO1dSjwsRcGNaGuPMUSDRuRm8tDlXeGpWUVF71w==", 110 + "requires": { 111 + "@types/bson": "*", 112 + "@types/node": "*" 113 + } 114 + }, 115 + "@types/node": { 116 + "version": "12.12.17", 117 + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.17.tgz", 118 + "integrity": "sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA==" 119 + }, 120 + "@typescript-eslint/eslint-plugin": { 121 + "version": "2.24.0", 122 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz", 123 + "integrity": "sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==", 124 + "dev": true, 125 + "requires": { 126 + "@typescript-eslint/experimental-utils": "2.24.0", 127 + "eslint-utils": "^1.4.3", 128 + "functional-red-black-tree": "^1.0.1", 129 + "regexpp": "^3.0.0", 130 + "tsutils": "^3.17.1" 131 + } 132 + }, 133 + "@typescript-eslint/experimental-utils": { 134 + "version": "2.24.0", 135 + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz", 136 + "integrity": "sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==", 137 + "dev": true, 138 + "requires": { 139 + "@types/json-schema": "^7.0.3", 140 + "@typescript-eslint/typescript-estree": "2.24.0", 141 + "eslint-scope": "^5.0.0" 142 + } 143 + }, 144 + "@typescript-eslint/parser": { 145 + "version": "2.24.0", 146 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.24.0.tgz", 147 + "integrity": "sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==", 148 + "dev": true, 149 + "requires": { 150 + "@types/eslint-visitor-keys": "^1.0.0", 151 + "@typescript-eslint/experimental-utils": "2.24.0", 152 + "@typescript-eslint/typescript-estree": "2.24.0", 153 + "eslint-visitor-keys": "^1.1.0" 154 + } 155 + }, 156 + "@typescript-eslint/typescript-estree": { 157 + "version": "2.24.0", 158 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz", 159 + "integrity": "sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA==", 160 + "dev": true, 161 + "requires": { 162 + "debug": "^4.1.1", 163 + "eslint-visitor-keys": "^1.1.0", 164 + "glob": "^7.1.6", 165 + "is-glob": "^4.0.1", 166 + "lodash": "^4.17.15", 167 + "semver": "^6.3.0", 168 + "tsutils": "^3.17.1" 169 + }, 170 + "dependencies": { 171 + "debug": { 172 + "version": "4.1.1", 173 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 174 + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 175 + "dev": true, 176 + "requires": { 177 + "ms": "^2.1.1" 178 + } 179 + }, 180 + "is-extglob": { 181 + "version": "2.1.1", 182 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 183 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 184 + "dev": true 185 + }, 186 + "is-glob": { 187 + "version": "4.0.1", 188 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 189 + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 190 + "dev": true, 191 + "requires": { 192 + "is-extglob": "^2.1.1" 193 + } 194 + }, 195 + "ms": { 196 + "version": "2.1.2", 197 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 198 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 199 + "dev": true 200 + }, 201 + "semver": { 202 + "version": "6.3.0", 203 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 204 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 205 + "dev": true 206 + } 207 + } 208 + }, 209 + "JSONStream": { 210 + "version": "1.3.5", 211 + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 212 + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 213 + "requires": { 214 + "jsonparse": "^1.2.0", 215 + "through": ">=2.2.7 <3" 216 + } 217 + }, 218 + "abbrev": { 219 + "version": "1.1.1", 220 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 221 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 222 + "optional": true 223 + }, 224 + "abort-controller": { 225 + "version": "3.0.0", 226 + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 227 + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 228 + "requires": { 229 + "event-target-shim": "^5.0.0" 230 + } 231 + }, 232 + "acorn": { 233 + "version": "7.1.1", 234 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 235 + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 236 + "dev": true 237 + }, 238 + "acorn-jsx": { 239 + "version": "5.2.0", 240 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", 241 + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", 242 + "dev": true 243 + }, 244 + "ajv": { 245 + "version": "6.12.0", 246 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", 247 + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", 248 + "dev": true, 249 + "requires": { 250 + "fast-deep-equal": "^3.1.1", 251 + "fast-json-stable-stringify": "^2.0.0", 252 + "json-schema-traverse": "^0.4.1", 253 + "uri-js": "^4.2.2" 254 + } 255 + }, 256 + "ansi-escapes": { 257 + "version": "4.3.1", 258 + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", 259 + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", 260 + "dev": true, 261 + "requires": { 262 + "type-fest": "^0.11.0" 263 + }, 264 + "dependencies": { 265 + "type-fest": { 266 + "version": "0.11.0", 267 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", 268 + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", 269 + "dev": true 270 + } 271 + } 272 + }, 273 + "ansi-regex": { 274 + "version": "5.0.0", 275 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 276 + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 277 + "dev": true 278 + }, 279 + "ansi-styles": { 280 + "version": "3.2.1", 281 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 282 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 283 + "dev": true, 284 + "requires": { 285 + "color-convert": "^1.9.0" 286 + } 287 + }, 288 + "anymatch": { 289 + "version": "2.0.0", 290 + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", 291 + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", 292 + "requires": { 293 + "micromatch": "^3.1.4", 294 + "normalize-path": "^2.1.1" 295 + }, 296 + "dependencies": { 297 + "normalize-path": { 298 + "version": "2.1.1", 299 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 300 + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 301 + "requires": { 302 + "remove-trailing-separator": "^1.0.1" 303 + } 304 + } 305 + } 306 + }, 307 + "aproba": { 308 + "version": "1.2.0", 309 + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 310 + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 311 + "optional": true 312 + }, 313 + "are-we-there-yet": { 314 + "version": "1.1.5", 315 + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 316 + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 317 + "optional": true, 318 + "requires": { 319 + "delegates": "^1.0.0", 320 + "readable-stream": "^2.0.6" 321 + } 322 + }, 323 + "argparse": { 324 + "version": "1.0.10", 325 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 326 + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 327 + "dev": true, 328 + "requires": { 329 + "sprintf-js": "~1.0.2" 330 + } 331 + }, 332 + "aria-query": { 333 + "version": "3.0.0", 334 + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", 335 + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", 336 + "dev": true, 337 + "requires": { 338 + "ast-types-flow": "0.0.7", 339 + "commander": "^2.11.0" 340 + } 341 + }, 342 + "arr-diff": { 343 + "version": "4.0.0", 344 + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 345 + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 346 + }, 347 + "arr-flatten": { 348 + "version": "1.1.0", 349 + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 350 + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 351 + }, 352 + "arr-union": { 353 + "version": "3.1.0", 354 + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 355 + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 356 + }, 357 + "array-includes": { 358 + "version": "3.1.0", 359 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.0.tgz", 360 + "integrity": "sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ==", 361 + "dev": true, 362 + "requires": { 363 + "define-properties": "^1.1.3", 364 + "es-abstract": "^1.17.0-next.0" 365 + } 366 + }, 367 + "array-unique": { 368 + "version": "0.3.2", 369 + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 370 + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 371 + }, 372 + "array.prototype.flat": { 373 + "version": "1.2.3", 374 + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", 375 + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", 376 + "dev": true, 377 + "requires": { 378 + "define-properties": "^1.1.3", 379 + "es-abstract": "^1.17.0-next.1" 380 + } 381 + }, 382 + "assign-symbols": { 383 + "version": "1.0.0", 384 + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 385 + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" 386 + }, 387 + "ast-types-flow": { 388 + "version": "0.0.7", 389 + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", 390 + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", 391 + "dev": true 392 + }, 393 + "astral-regex": { 394 + "version": "1.0.0", 395 + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 396 + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 397 + "dev": true 398 + }, 399 + "async": { 400 + "version": "1.5.2", 401 + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 402 + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" 403 + }, 404 + "async-each": { 405 + "version": "1.0.3", 406 + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", 407 + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" 408 + }, 409 + "asynckit": { 410 + "version": "0.4.0", 411 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 412 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 413 + }, 414 + "atob": { 415 + "version": "2.1.2", 416 + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", 417 + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" 418 + }, 419 + "axios": { 420 + "version": "0.19.2", 421 + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", 422 + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", 423 + "requires": { 424 + "follow-redirects": "1.5.10" 425 + } 426 + }, 427 + "axobject-query": { 428 + "version": "2.1.1", 429 + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.1.tgz", 430 + "integrity": "sha512-lF98xa/yvy6j3fBHAgQXIYl+J4eZadOSqsPojemUqClzNbBV38wWGpUbQbVEyf4eUF5yF7eHmGgGA2JiHyjeqw==", 431 + "dev": true, 432 + "requires": { 433 + "@babel/runtime": "^7.7.4", 434 + "@babel/runtime-corejs3": "^7.7.4" 435 + } 436 + }, 437 + "balanced-match": { 438 + "version": "1.0.0", 439 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 440 + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 441 + }, 442 + "base": { 443 + "version": "0.11.2", 444 + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 445 + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 446 + "requires": { 447 + "cache-base": "^1.0.1", 448 + "class-utils": "^0.3.5", 449 + "component-emitter": "^1.2.1", 450 + "define-property": "^1.0.0", 451 + "isobject": "^3.0.1", 452 + "mixin-deep": "^1.2.0", 453 + "pascalcase": "^0.1.1" 454 + }, 455 + "dependencies": { 456 + "define-property": { 457 + "version": "1.0.0", 458 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 459 + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 460 + "requires": { 461 + "is-descriptor": "^1.0.0" 462 + } 463 + }, 464 + "is-accessor-descriptor": { 465 + "version": "1.0.0", 466 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 467 + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 468 + "requires": { 469 + "kind-of": "^6.0.0" 470 + } 471 + }, 472 + "is-data-descriptor": { 473 + "version": "1.0.0", 474 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 475 + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 476 + "requires": { 477 + "kind-of": "^6.0.0" 478 + } 479 + }, 480 + "is-descriptor": { 481 + "version": "1.0.2", 482 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 483 + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 484 + "requires": { 485 + "is-accessor-descriptor": "^1.0.0", 486 + "is-data-descriptor": "^1.0.0", 487 + "kind-of": "^6.0.2" 488 + } 489 + } 490 + } 491 + }, 492 + "binary-extensions": { 493 + "version": "1.13.1", 494 + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", 495 + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" 496 + }, 497 + "bindings": { 498 + "version": "1.2.1", 499 + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", 500 + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" 501 + }, 502 + "bl": { 503 + "version": "1.2.2", 504 + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 505 + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 506 + "requires": { 507 + "readable-stream": "^2.3.5", 508 + "safe-buffer": "^5.1.1" 509 + }, 510 + "dependencies": { 511 + "process-nextick-args": { 512 + "version": "2.0.0", 513 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 514 + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 515 + }, 516 + "readable-stream": { 517 + "version": "2.3.6", 518 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 519 + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 520 + "requires": { 521 + "core-util-is": "~1.0.0", 522 + "inherits": "~2.0.3", 523 + "isarray": "~1.0.0", 524 + "process-nextick-args": "~2.0.0", 525 + "safe-buffer": "~5.1.1", 526 + "string_decoder": "~1.1.1", 527 + "util-deprecate": "~1.0.1" 528 + } 529 + }, 530 + "string_decoder": { 531 + "version": "1.1.1", 532 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 533 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 534 + "requires": { 535 + "safe-buffer": "~5.1.0" 536 + } 537 + } 538 + } 539 + }, 540 + "blapi": { 541 + "version": "1.3.1", 542 + "resolved": "https://registry.npmjs.org/blapi/-/blapi-1.3.1.tgz", 543 + "integrity": "sha512-cX8iZxAykG9OmGRRmE5UAsZrIW0bdexPkxXb1KwfLzBhaGju8FPNFYgAXVcvMP1XB2y0QVzp3pV1hioY8KF1ng==", 544 + "requires": { 545 + "node-fetch": "^2.6.0" 546 + } 547 + }, 548 + "brace-expansion": { 549 + "version": "1.1.8", 550 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 551 + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 552 + "requires": { 553 + "balanced-match": "^1.0.0", 554 + "concat-map": "0.0.1" 555 + } 556 + }, 557 + "braces": { 558 + "version": "2.3.2", 559 + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 560 + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 561 + "requires": { 562 + "arr-flatten": "^1.1.0", 563 + "array-unique": "^0.3.2", 564 + "extend-shallow": "^2.0.1", 565 + "fill-range": "^4.0.0", 566 + "isobject": "^3.0.1", 567 + "repeat-element": "^1.1.2", 568 + "snapdragon": "^0.8.1", 569 + "snapdragon-node": "^2.0.1", 570 + "split-string": "^3.0.2", 571 + "to-regex": "^3.0.1" 572 + }, 573 + "dependencies": { 574 + "extend-shallow": { 575 + "version": "2.0.1", 576 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 577 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 578 + "requires": { 579 + "is-extendable": "^0.1.0" 580 + } 581 + } 582 + } 583 + }, 584 + "broadway": { 585 + "version": "0.3.6", 586 + "resolved": "https://registry.npmjs.org/broadway/-/broadway-0.3.6.tgz", 587 + "integrity": "sha1-fb7waLlUt5B5Jf1USWO1eKkCuno=", 588 + "requires": { 589 + "cliff": "0.1.9", 590 + "eventemitter2": "0.4.14", 591 + "nconf": "0.6.9", 592 + "utile": "0.2.1", 593 + "winston": "0.8.0" 594 + }, 595 + "dependencies": { 596 + "async": { 597 + "version": "0.2.10", 598 + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 599 + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" 600 + }, 601 + "cliff": { 602 + "version": "0.1.9", 603 + "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.9.tgz", 604 + "integrity": "sha1-ohHgnGo947oa8n0EnTASUNGIErw=", 605 + "requires": { 606 + "colors": "0.x.x", 607 + "eyes": "0.1.x", 608 + "winston": "0.8.x" 609 + } 610 + }, 611 + "nconf": { 612 + "version": "0.6.9", 613 + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.6.9.tgz", 614 + "integrity": "sha1-lXDvFe1vmuays8jV5xtm0xk81mE=", 615 + "requires": { 616 + "async": "0.2.9", 617 + "ini": "1.x.x", 618 + "optimist": "0.6.0" 619 + }, 620 + "dependencies": { 621 + "async": { 622 + "version": "0.2.9", 623 + "resolved": "https://registry.npmjs.org/async/-/async-0.2.9.tgz", 624 + "integrity": "sha1-32MGD789Myhqdqr21Vophtn/hhk=" 625 + } 626 + } 627 + }, 628 + "optimist": { 629 + "version": "0.6.0", 630 + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", 631 + "integrity": "sha1-aUJIJvNAX3nxQub8PZrljU27kgA=", 632 + "requires": { 633 + "minimist": "~0.0.1", 634 + "wordwrap": "~0.0.2" 635 + } 636 + }, 637 + "utile": { 638 + "version": "0.2.1", 639 + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", 640 + "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", 641 + "requires": { 642 + "async": "~0.2.9", 643 + "deep-equal": "*", 644 + "i": "0.3.x", 645 + "mkdirp": "0.x.x", 646 + "ncp": "0.4.x", 647 + "rimraf": "2.x.x" 648 + } 649 + }, 650 + "winston": { 651 + "version": "0.8.0", 652 + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.0.tgz", 653 + "integrity": "sha1-YdCDD6aZcGISIGsKK1ymmpMENmg=", 654 + "requires": { 655 + "async": "0.2.x", 656 + "colors": "0.6.x", 657 + "cycle": "1.0.x", 658 + "eyes": "0.1.x", 659 + "pkginfo": "0.3.x", 660 + "stack-trace": "0.0.x" 661 + } 662 + } 663 + } 664 + }, 665 + "bson": { 666 + "version": "1.1.3", 667 + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", 668 + "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" 669 + }, 670 + "bufferutil": { 671 + "version": "4.0.1", 672 + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.1.tgz", 673 + "integrity": "sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA==", 674 + "requires": { 675 + "node-gyp-build": "~3.7.0" 676 + } 677 + }, 678 + "cache-base": { 679 + "version": "1.0.1", 680 + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 681 + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 682 + "requires": { 683 + "collection-visit": "^1.0.0", 684 + "component-emitter": "^1.2.1", 685 + "get-value": "^2.0.6", 686 + "has-value": "^1.0.0", 687 + "isobject": "^3.0.1", 688 + "set-value": "^2.0.0", 689 + "to-object-path": "^0.3.0", 690 + "union-value": "^1.0.0", 691 + "unset-value": "^1.0.0" 692 + } 693 + }, 694 + "caller": { 695 + "version": "0.0.1", 696 + "resolved": "https://registry.npmjs.org/caller/-/caller-0.0.1.tgz", 697 + "integrity": "sha1-83odbqEOgp2UchrimpC7T7Uqt2c=", 698 + "requires": { 699 + "tape": "~2.3.2" 700 + } 701 + }, 702 + "callsites": { 703 + "version": "3.1.0", 704 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 705 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 706 + "dev": true 707 + }, 708 + "camelcase": { 709 + "version": "2.1.1", 710 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 711 + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 712 + }, 713 + "chalk": { 714 + "version": "2.4.2", 715 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 716 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 717 + "dev": true, 718 + "requires": { 719 + "ansi-styles": "^3.2.1", 720 + "escape-string-regexp": "^1.0.5", 721 + "supports-color": "^5.3.0" 722 + } 723 + }, 724 + "chardet": { 725 + "version": "0.7.0", 726 + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 727 + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 728 + "dev": true 729 + }, 730 + "chokidar": { 731 + "version": "2.1.8", 732 + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", 733 + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", 734 + "requires": { 735 + "anymatch": "^2.0.0", 736 + "async-each": "^1.0.1", 737 + "braces": "^2.3.2", 738 + "fsevents": "^1.2.7", 739 + "glob-parent": "^3.1.0", 740 + "inherits": "^2.0.3", 741 + "is-binary-path": "^1.0.0", 742 + "is-glob": "^4.0.0", 743 + "normalize-path": "^3.0.0", 744 + "path-is-absolute": "^1.0.0", 745 + "readdirp": "^2.2.1", 746 + "upath": "^1.1.1" 747 + } 748 + }, 749 + "chownr": { 750 + "version": "1.1.4", 751 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 752 + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", 753 + "optional": true 754 + }, 755 + "class-utils": { 756 + "version": "0.3.6", 757 + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 758 + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 759 + "requires": { 760 + "arr-union": "^3.1.0", 761 + "define-property": "^0.2.5", 762 + "isobject": "^3.0.0", 763 + "static-extend": "^0.1.1" 764 + }, 765 + "dependencies": { 766 + "define-property": { 767 + "version": "0.2.5", 768 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 769 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 770 + "requires": { 771 + "is-descriptor": "^0.1.0" 772 + } 773 + } 774 + } 775 + }, 776 + "cli-cursor": { 777 + "version": "3.1.0", 778 + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 779 + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 780 + "dev": true, 781 + "requires": { 782 + "restore-cursor": "^3.1.0" 783 + } 784 + }, 785 + "cli-width": { 786 + "version": "2.2.0", 787 + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 788 + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 789 + "dev": true 790 + }, 791 + "cliff": { 792 + "version": "0.1.10", 793 + "resolved": "https://registry.npmjs.org/cliff/-/cliff-0.1.10.tgz", 794 + "integrity": "sha1-U74z6p9ZvshWCe4wCsQgdgPlIBM=", 795 + "requires": { 796 + "colors": "~1.0.3", 797 + "eyes": "~0.1.8", 798 + "winston": "0.8.x" 799 + }, 800 + "dependencies": { 801 + "colors": { 802 + "version": "1.0.3", 803 + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 804 + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 805 + } 806 + } 807 + }, 808 + "cliui": { 809 + "version": "3.2.0", 810 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 811 + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 812 + "requires": { 813 + "string-width": "^1.0.1", 814 + "strip-ansi": "^3.0.1", 815 + "wrap-ansi": "^2.0.0" 816 + }, 817 + "dependencies": { 818 + "ansi-regex": { 819 + "version": "2.1.1", 820 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 821 + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 822 + }, 823 + "is-fullwidth-code-point": { 824 + "version": "1.0.0", 825 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 826 + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 827 + "requires": { 828 + "number-is-nan": "^1.0.0" 829 + } 830 + }, 831 + "string-width": { 832 + "version": "1.0.2", 833 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 834 + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 835 + "requires": { 836 + "code-point-at": "^1.0.0", 837 + "is-fullwidth-code-point": "^1.0.0", 838 + "strip-ansi": "^3.0.0" 839 + } 840 + }, 841 + "strip-ansi": { 842 + "version": "3.0.1", 843 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 844 + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 845 + "requires": { 846 + "ansi-regex": "^2.0.0" 847 + } 848 + } 849 + } 850 + }, 851 + "clone": { 852 + "version": "2.1.2", 853 + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", 854 + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" 855 + }, 856 + "code-point-at": { 857 + "version": "1.1.0", 858 + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 859 + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 860 + }, 861 + "collection-visit": { 862 + "version": "1.0.0", 863 + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 864 + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 865 + "requires": { 866 + "map-visit": "^1.0.0", 867 + "object-visit": "^1.0.0" 868 + } 869 + }, 870 + "color-convert": { 871 + "version": "1.9.3", 872 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 873 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 874 + "dev": true, 875 + "requires": { 876 + "color-name": "1.1.3" 877 + } 878 + }, 879 + "color-name": { 880 + "version": "1.1.3", 881 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 882 + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 883 + "dev": true 884 + }, 885 + "colors": { 886 + "version": "0.6.2", 887 + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 888 + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=" 889 + }, 890 + "combined-stream": { 891 + "version": "1.0.8", 892 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 893 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 894 + "requires": { 895 + "delayed-stream": "~1.0.0" 896 + } 897 + }, 898 + "commander": { 899 + "version": "2.20.3", 900 + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 901 + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 902 + }, 903 + "component-emitter": { 904 + "version": "1.3.0", 905 + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 906 + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 907 + }, 908 + "concat-map": { 909 + "version": "0.0.1", 910 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 911 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 912 + }, 913 + "confusing-browser-globals": { 914 + "version": "1.0.9", 915 + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", 916 + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", 917 + "dev": true 918 + }, 919 + "console-control-strings": { 920 + "version": "1.1.0", 921 + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 922 + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", 923 + "optional": true 924 + }, 925 + "contains-path": { 926 + "version": "0.1.0", 927 + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 928 + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 929 + "dev": true 930 + }, 931 + "copy-descriptor": { 932 + "version": "0.1.1", 933 + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 934 + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 935 + }, 936 + "core-js-pure": { 937 + "version": "3.5.0", 938 + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.5.0.tgz", 939 + "integrity": "sha512-wB0QtKAofWigiISuT1Tej3hKgq932fB//Lf1VoPbiLpTYlHY0nIDhgF+q1na0DAKFHH5wGCirkAknOmDN8ijXA==", 940 + "dev": true 941 + }, 942 + "core-util-is": { 943 + "version": "1.0.2", 944 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 945 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 946 + }, 947 + "cross-spawn": { 948 + "version": "6.0.5", 949 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 950 + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 951 + "dev": true, 952 + "requires": { 953 + "nice-try": "^1.0.4", 954 + "path-key": "^2.0.1", 955 + "semver": "^5.5.0", 956 + "shebang-command": "^1.2.0", 957 + "which": "^1.2.9" 958 + } 959 + }, 960 + "cycle": { 961 + "version": "1.0.3", 962 + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 963 + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 964 + }, 965 + "damerau-levenshtein": { 966 + "version": "1.0.5", 967 + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", 968 + "integrity": "sha512-CBCRqFnpu715iPmw1KrdOrzRqbdFwQTwAWyyyYS42+iAgHCuXZ+/TdMgQkUENPomxEz9z1BEzuQU2Xw0kUuAgA==", 969 + "dev": true 970 + }, 971 + "dblapi.js": { 972 + "version": "2.4.0", 973 + "resolved": "https://registry.npmjs.org/dblapi.js/-/dblapi.js-2.4.0.tgz", 974 + "integrity": "sha512-SqDYVcV1DBQnyhySTjd+Qvzu7jFr+4eKwl56fGpIti7OlXGF5dmDPeo3jQfRlOXTRn5/I5997MDIJukoDxE3Mg==" 975 + }, 976 + "debug": { 977 + "version": "3.1.0", 978 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 979 + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 980 + "requires": { 981 + "ms": "2.0.0" 982 + } 983 + }, 984 + "decamelize": { 985 + "version": "1.2.0", 986 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 987 + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 988 + }, 989 + "decode-uri-component": { 990 + "version": "0.2.0", 991 + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 992 + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 993 + }, 994 + "deep-equal": { 995 + "version": "2.0.1", 996 + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.1.tgz", 997 + "integrity": "sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==", 998 + "requires": { 999 + "es-abstract": "^1.16.3", 1000 + "es-get-iterator": "^1.0.1", 1001 + "is-arguments": "^1.0.4", 1002 + "is-date-object": "^1.0.1", 1003 + "is-regex": "^1.0.4", 1004 + "isarray": "^2.0.5", 1005 + "object-is": "^1.0.1", 1006 + "object-keys": "^1.1.1", 1007 + "regexp.prototype.flags": "^1.2.0", 1008 + "side-channel": "^1.0.1", 1009 + "which-boxed-primitive": "^1.0.1", 1010 + "which-collection": "^1.0.0" 1011 + }, 1012 + "dependencies": { 1013 + "es-abstract": { 1014 + "version": "1.17.4", 1015 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 1016 + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 1017 + "requires": { 1018 + "es-to-primitive": "^1.2.1", 1019 + "function-bind": "^1.1.1", 1020 + "has": "^1.0.3", 1021 + "has-symbols": "^1.0.1", 1022 + "is-callable": "^1.1.5", 1023 + "is-regex": "^1.0.5", 1024 + "object-inspect": "^1.7.0", 1025 + "object-keys": "^1.1.1", 1026 + "object.assign": "^4.1.0", 1027 + "string.prototype.trimleft": "^2.1.1", 1028 + "string.prototype.trimright": "^2.1.1" 1029 + }, 1030 + "dependencies": { 1031 + "is-regex": { 1032 + "version": "1.0.5", 1033 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1034 + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1035 + "requires": { 1036 + "has": "^1.0.3" 1037 + } 1038 + } 1039 + } 1040 + }, 1041 + "is-callable": { 1042 + "version": "1.1.5", 1043 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1044 + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 1045 + }, 1046 + "isarray": { 1047 + "version": "2.0.5", 1048 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1049 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" 1050 + }, 1051 + "string.prototype.trimleft": { 1052 + "version": "2.1.1", 1053 + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1054 + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1055 + "requires": { 1056 + "define-properties": "^1.1.3", 1057 + "function-bind": "^1.1.1" 1058 + } 1059 + }, 1060 + "string.prototype.trimright": { 1061 + "version": "2.1.1", 1062 + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1063 + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1064 + "requires": { 1065 + "define-properties": "^1.1.3", 1066 + "function-bind": "^1.1.1" 1067 + } 1068 + } 1069 + } 1070 + }, 1071 + "deep-extend": { 1072 + "version": "0.6.0", 1073 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 1074 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 1075 + "optional": true 1076 + }, 1077 + "deep-is": { 1078 + "version": "0.1.3", 1079 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 1080 + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 1081 + "dev": true 1082 + }, 1083 + "deferential": { 1084 + "version": "1.0.0", 1085 + "resolved": "https://registry.npmjs.org/deferential/-/deferential-1.0.0.tgz", 1086 + "integrity": "sha1-9IHJXithoSHIqrnWtB944EVECX0=", 1087 + "requires": { 1088 + "native-promise-only": "^0.8.1" 1089 + } 1090 + }, 1091 + "define-properties": { 1092 + "version": "1.1.3", 1093 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1094 + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1095 + "requires": { 1096 + "object-keys": "^1.0.12" 1097 + } 1098 + }, 1099 + "define-property": { 1100 + "version": "2.0.2", 1101 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 1102 + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 1103 + "requires": { 1104 + "is-descriptor": "^1.0.2", 1105 + "isobject": "^3.0.1" 1106 + }, 1107 + "dependencies": { 1108 + "is-accessor-descriptor": { 1109 + "version": "1.0.0", 1110 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1111 + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1112 + "requires": { 1113 + "kind-of": "^6.0.0" 1114 + } 1115 + }, 1116 + "is-data-descriptor": { 1117 + "version": "1.0.0", 1118 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1119 + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1120 + "requires": { 1121 + "kind-of": "^6.0.0" 1122 + } 1123 + }, 1124 + "is-descriptor": { 1125 + "version": "1.0.2", 1126 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1127 + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1128 + "requires": { 1129 + "is-accessor-descriptor": "^1.0.0", 1130 + "is-data-descriptor": "^1.0.0", 1131 + "kind-of": "^6.0.2" 1132 + } 1133 + } 1134 + } 1135 + }, 1136 + "defined": { 1137 + "version": "0.0.0", 1138 + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", 1139 + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=" 1140 + }, 1141 + "delayed-stream": { 1142 + "version": "1.0.0", 1143 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1144 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 1145 + }, 1146 + "delegates": { 1147 + "version": "1.0.0", 1148 + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 1149 + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 1150 + "optional": true 1151 + }, 1152 + "denque": { 1153 + "version": "1.4.1", 1154 + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 1155 + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 1156 + }, 1157 + "detect-libc": { 1158 + "version": "1.0.3", 1159 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 1160 + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 1161 + "optional": true 1162 + }, 1163 + "director": { 1164 + "version": "1.2.7", 1165 + "resolved": "https://registry.npmjs.org/director/-/director-1.2.7.tgz", 1166 + "integrity": "sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM=" 1167 + }, 1168 + "discord.js": { 1169 + "version": "12.0.2", 1170 + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.0.2.tgz", 1171 + "integrity": "sha512-iZiEA4Y61gqq/EjFfLXnkRK9pLapnax/vTVDUhs/mAhyqozAy0GOlk/MZI9rSa1iIoKTWRq6P9CRKhLNT2wUnA==", 1172 + "requires": { 1173 + "@discordjs/collection": "^0.1.5", 1174 + "abort-controller": "^3.0.0", 1175 + "form-data": "^3.0.0", 1176 + "node-fetch": "^2.6.0", 1177 + "prism-media": "^1.2.0", 1178 + "setimmediate": "^1.0.5", 1179 + "tweetnacl": "^1.0.3", 1180 + "ws": "^7.2.1" 1181 + } 1182 + }, 1183 + "doctrine": { 1184 + "version": "3.0.0", 1185 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 1186 + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 1187 + "dev": true, 1188 + "requires": { 1189 + "esutils": "^2.0.2" 1190 + } 1191 + }, 1192 + "dotenv": { 1193 + "version": "8.2.0", 1194 + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 1195 + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 1196 + }, 1197 + "emoji-regex": { 1198 + "version": "8.0.0", 1199 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1200 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1201 + "dev": true 1202 + }, 1203 + "error-ex": { 1204 + "version": "1.3.2", 1205 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1206 + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1207 + "dev": true, 1208 + "requires": { 1209 + "is-arrayish": "^0.2.1" 1210 + } 1211 + }, 1212 + "es-abstract": { 1213 + "version": "1.17.0-next.1", 1214 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", 1215 + "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", 1216 + "requires": { 1217 + "es-to-primitive": "^1.2.1", 1218 + "function-bind": "^1.1.1", 1219 + "has": "^1.0.3", 1220 + "has-symbols": "^1.0.1", 1221 + "is-callable": "^1.1.4", 1222 + "is-regex": "^1.0.4", 1223 + "object-inspect": "^1.7.0", 1224 + "object-keys": "^1.1.1", 1225 + "object.assign": "^4.1.0", 1226 + "string.prototype.trimleft": "^2.1.0", 1227 + "string.prototype.trimright": "^2.1.0" 1228 + } 1229 + }, 1230 + "es-get-iterator": { 1231 + "version": "1.1.0", 1232 + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", 1233 + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", 1234 + "requires": { 1235 + "es-abstract": "^1.17.4", 1236 + "has-symbols": "^1.0.1", 1237 + "is-arguments": "^1.0.4", 1238 + "is-map": "^2.0.1", 1239 + "is-set": "^2.0.1", 1240 + "is-string": "^1.0.5", 1241 + "isarray": "^2.0.5" 1242 + }, 1243 + "dependencies": { 1244 + "es-abstract": { 1245 + "version": "1.17.4", 1246 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 1247 + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 1248 + "requires": { 1249 + "es-to-primitive": "^1.2.1", 1250 + "function-bind": "^1.1.1", 1251 + "has": "^1.0.3", 1252 + "has-symbols": "^1.0.1", 1253 + "is-callable": "^1.1.5", 1254 + "is-regex": "^1.0.5", 1255 + "object-inspect": "^1.7.0", 1256 + "object-keys": "^1.1.1", 1257 + "object.assign": "^4.1.0", 1258 + "string.prototype.trimleft": "^2.1.1", 1259 + "string.prototype.trimright": "^2.1.1" 1260 + } 1261 + }, 1262 + "is-callable": { 1263 + "version": "1.1.5", 1264 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1265 + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 1266 + }, 1267 + "is-regex": { 1268 + "version": "1.0.5", 1269 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1270 + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1271 + "requires": { 1272 + "has": "^1.0.3" 1273 + } 1274 + }, 1275 + "isarray": { 1276 + "version": "2.0.5", 1277 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 1278 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" 1279 + }, 1280 + "string.prototype.trimleft": { 1281 + "version": "2.1.1", 1282 + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1283 + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1284 + "requires": { 1285 + "define-properties": "^1.1.3", 1286 + "function-bind": "^1.1.1" 1287 + } 1288 + }, 1289 + "string.prototype.trimright": { 1290 + "version": "2.1.1", 1291 + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1292 + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1293 + "requires": { 1294 + "define-properties": "^1.1.3", 1295 + "function-bind": "^1.1.1" 1296 + } 1297 + } 1298 + } 1299 + }, 1300 + "es-to-primitive": { 1301 + "version": "1.2.1", 1302 + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1303 + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1304 + "requires": { 1305 + "is-callable": "^1.1.4", 1306 + "is-date-object": "^1.0.1", 1307 + "is-symbol": "^1.0.2" 1308 + } 1309 + }, 1310 + "escape-string-regexp": { 1311 + "version": "1.0.5", 1312 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1313 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1314 + "dev": true 1315 + }, 1316 + "eslint": { 1317 + "version": "6.8.0", 1318 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 1319 + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 1320 + "dev": true, 1321 + "requires": { 1322 + "@babel/code-frame": "^7.0.0", 1323 + "ajv": "^6.10.0", 1324 + "chalk": "^2.1.0", 1325 + "cross-spawn": "^6.0.5", 1326 + "debug": "^4.0.1", 1327 + "doctrine": "^3.0.0", 1328 + "eslint-scope": "^5.0.0", 1329 + "eslint-utils": "^1.4.3", 1330 + "eslint-visitor-keys": "^1.1.0", 1331 + "espree": "^6.1.2", 1332 + "esquery": "^1.0.1", 1333 + "esutils": "^2.0.2", 1334 + "file-entry-cache": "^5.0.1", 1335 + "functional-red-black-tree": "^1.0.1", 1336 + "glob-parent": "^5.0.0", 1337 + "globals": "^12.1.0", 1338 + "ignore": "^4.0.6", 1339 + "import-fresh": "^3.0.0", 1340 + "imurmurhash": "^0.1.4", 1341 + "inquirer": "^7.0.0", 1342 + "is-glob": "^4.0.0", 1343 + "js-yaml": "^3.13.1", 1344 + "json-stable-stringify-without-jsonify": "^1.0.1", 1345 + "levn": "^0.3.0", 1346 + "lodash": "^4.17.14", 1347 + "minimatch": "^3.0.4", 1348 + "mkdirp": "^0.5.1", 1349 + "natural-compare": "^1.4.0", 1350 + "optionator": "^0.8.3", 1351 + "progress": "^2.0.0", 1352 + "regexpp": "^2.0.1", 1353 + "semver": "^6.1.2", 1354 + "strip-ansi": "^5.2.0", 1355 + "strip-json-comments": "^3.0.1", 1356 + "table": "^5.2.3", 1357 + "text-table": "^0.2.0", 1358 + "v8-compile-cache": "^2.0.3" 1359 + }, 1360 + "dependencies": { 1361 + "debug": { 1362 + "version": "4.1.1", 1363 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1364 + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1365 + "dev": true, 1366 + "requires": { 1367 + "ms": "^2.1.1" 1368 + } 1369 + }, 1370 + "glob-parent": { 1371 + "version": "5.1.0", 1372 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 1373 + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 1374 + "dev": true, 1375 + "requires": { 1376 + "is-glob": "^4.0.1" 1377 + } 1378 + }, 1379 + "is-extglob": { 1380 + "version": "2.1.1", 1381 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1382 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1383 + "dev": true 1384 + }, 1385 + "is-glob": { 1386 + "version": "4.0.1", 1387 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1388 + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1389 + "dev": true, 1390 + "requires": { 1391 + "is-extglob": "^2.1.1" 1392 + } 1393 + }, 1394 + "ms": { 1395 + "version": "2.1.2", 1396 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1397 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1398 + "dev": true 1399 + }, 1400 + "regexpp": { 1401 + "version": "2.0.1", 1402 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 1403 + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 1404 + "dev": true 1405 + }, 1406 + "semver": { 1407 + "version": "6.3.0", 1408 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1409 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1410 + "dev": true 1411 + } 1412 + } 1413 + }, 1414 + "eslint-config-airbnb": { 1415 + "version": "18.1.0", 1416 + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.1.0.tgz", 1417 + "integrity": "sha512-kZFuQC/MPnH7KJp6v95xsLBf63G/w7YqdPfQ0MUanxQ7zcKUNG8j+sSY860g3NwCBOa62apw16J6pRN+AOgXzw==", 1418 + "dev": true, 1419 + "requires": { 1420 + "eslint-config-airbnb-base": "^14.1.0", 1421 + "object.assign": "^4.1.0", 1422 + "object.entries": "^1.1.1" 1423 + } 1424 + }, 1425 + "eslint-config-airbnb-base": { 1426 + "version": "14.1.0", 1427 + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz", 1428 + "integrity": "sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw==", 1429 + "dev": true, 1430 + "requires": { 1431 + "confusing-browser-globals": "^1.0.9", 1432 + "object.assign": "^4.1.0", 1433 + "object.entries": "^1.1.1" 1434 + } 1435 + }, 1436 + "eslint-config-prettier": { 1437 + "version": "6.10.0", 1438 + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz", 1439 + "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==", 1440 + "dev": true, 1441 + "requires": { 1442 + "get-stdin": "^6.0.0" 1443 + } 1444 + }, 1445 + "eslint-config-standard": { 1446 + "version": "14.1.0", 1447 + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", 1448 + "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", 1449 + "dev": true 1450 + }, 1451 + "eslint-import-resolver-node": { 1452 + "version": "0.3.3", 1453 + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", 1454 + "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", 1455 + "dev": true, 1456 + "requires": { 1457 + "debug": "^2.6.9", 1458 + "resolve": "^1.13.1" 1459 + }, 1460 + "dependencies": { 1461 + "debug": { 1462 + "version": "2.6.9", 1463 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1464 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1465 + "dev": true, 1466 + "requires": { 1467 + "ms": "2.0.0" 1468 + } 1469 + } 1470 + } 1471 + }, 1472 + "eslint-import-resolver-typescript": { 1473 + "version": "2.0.0", 1474 + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-2.0.0.tgz", 1475 + "integrity": "sha512-bT5Frpl8UWoHBtY25vKUOMoVIMlJQOMefHLyQ4Tz3MQpIZ2N6yYKEEIHMo38bszBNUuMBW6M3+5JNYxeiGFH4w==", 1476 + "dev": true, 1477 + "requires": { 1478 + "debug": "^4.1.1", 1479 + "is-glob": "^4.0.1", 1480 + "resolve": "^1.12.0", 1481 + "tiny-glob": "^0.2.6", 1482 + "tsconfig-paths": "^3.9.0" 1483 + }, 1484 + "dependencies": { 1485 + "debug": { 1486 + "version": "4.1.1", 1487 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1488 + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1489 + "dev": true, 1490 + "requires": { 1491 + "ms": "^2.1.1" 1492 + } 1493 + }, 1494 + "is-extglob": { 1495 + "version": "2.1.1", 1496 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1497 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1498 + "dev": true 1499 + }, 1500 + "is-glob": { 1501 + "version": "4.0.1", 1502 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1503 + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1504 + "dev": true, 1505 + "requires": { 1506 + "is-extglob": "^2.1.1" 1507 + } 1508 + }, 1509 + "ms": { 1510 + "version": "2.1.2", 1511 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1512 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1513 + "dev": true 1514 + } 1515 + } 1516 + }, 1517 + "eslint-module-utils": { 1518 + "version": "2.5.2", 1519 + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", 1520 + "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", 1521 + "dev": true, 1522 + "requires": { 1523 + "debug": "^2.6.9", 1524 + "pkg-dir": "^2.0.0" 1525 + }, 1526 + "dependencies": { 1527 + "debug": { 1528 + "version": "2.6.9", 1529 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1530 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1531 + "dev": true, 1532 + "requires": { 1533 + "ms": "2.0.0" 1534 + } 1535 + } 1536 + } 1537 + }, 1538 + "eslint-plugin-es": { 1539 + "version": "2.0.0", 1540 + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", 1541 + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", 1542 + "dev": true, 1543 + "requires": { 1544 + "eslint-utils": "^1.4.2", 1545 + "regexpp": "^3.0.0" 1546 + } 1547 + }, 1548 + "eslint-plugin-import": { 1549 + "version": "2.20.1", 1550 + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", 1551 + "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", 1552 + "dev": true, 1553 + "requires": { 1554 + "array-includes": "^3.0.3", 1555 + "array.prototype.flat": "^1.2.1", 1556 + "contains-path": "^0.1.0", 1557 + "debug": "^2.6.9", 1558 + "doctrine": "1.5.0", 1559 + "eslint-import-resolver-node": "^0.3.2", 1560 + "eslint-module-utils": "^2.4.1", 1561 + "has": "^1.0.3", 1562 + "minimatch": "^3.0.4", 1563 + "object.values": "^1.1.0", 1564 + "read-pkg-up": "^2.0.0", 1565 + "resolve": "^1.12.0" 1566 + }, 1567 + "dependencies": { 1568 + "debug": { 1569 + "version": "2.6.9", 1570 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1571 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1572 + "dev": true, 1573 + "requires": { 1574 + "ms": "2.0.0" 1575 + } 1576 + }, 1577 + "doctrine": { 1578 + "version": "1.5.0", 1579 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 1580 + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 1581 + "dev": true, 1582 + "requires": { 1583 + "esutils": "^2.0.2", 1584 + "isarray": "^1.0.0" 1585 + } 1586 + } 1587 + } 1588 + }, 1589 + "eslint-plugin-jsx-a11y": { 1590 + "version": "6.2.3", 1591 + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz", 1592 + "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==", 1593 + "dev": true, 1594 + "requires": { 1595 + "@babel/runtime": "^7.4.5", 1596 + "aria-query": "^3.0.0", 1597 + "array-includes": "^3.0.3", 1598 + "ast-types-flow": "^0.0.7", 1599 + "axobject-query": "^2.0.2", 1600 + "damerau-levenshtein": "^1.0.4", 1601 + "emoji-regex": "^7.0.2", 1602 + "has": "^1.0.3", 1603 + "jsx-ast-utils": "^2.2.1" 1604 + }, 1605 + "dependencies": { 1606 + "emoji-regex": { 1607 + "version": "7.0.3", 1608 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 1609 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 1610 + "dev": true 1611 + } 1612 + } 1613 + }, 1614 + "eslint-plugin-node": { 1615 + "version": "10.0.0", 1616 + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", 1617 + "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", 1618 + "dev": true, 1619 + "requires": { 1620 + "eslint-plugin-es": "^2.0.0", 1621 + "eslint-utils": "^1.4.2", 1622 + "ignore": "^5.1.1", 1623 + "minimatch": "^3.0.4", 1624 + "resolve": "^1.10.1", 1625 + "semver": "^6.1.0" 1626 + }, 1627 + "dependencies": { 1628 + "ignore": { 1629 + "version": "5.1.4", 1630 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", 1631 + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", 1632 + "dev": true 1633 + }, 1634 + "semver": { 1635 + "version": "6.3.0", 1636 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1637 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1638 + "dev": true 1639 + } 1640 + } 1641 + }, 1642 + "eslint-plugin-prettier": { 1643 + "version": "3.1.2", 1644 + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", 1645 + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", 1646 + "dev": true, 1647 + "requires": { 1648 + "prettier-linter-helpers": "^1.0.0" 1649 + } 1650 + }, 1651 + "eslint-plugin-react": { 1652 + "version": "7.19.0", 1653 + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", 1654 + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", 1655 + "dev": true, 1656 + "requires": { 1657 + "array-includes": "^3.1.1", 1658 + "doctrine": "^2.1.0", 1659 + "has": "^1.0.3", 1660 + "jsx-ast-utils": "^2.2.3", 1661 + "object.entries": "^1.1.1", 1662 + "object.fromentries": "^2.0.2", 1663 + "object.values": "^1.1.1", 1664 + "prop-types": "^15.7.2", 1665 + "resolve": "^1.15.1", 1666 + "semver": "^6.3.0", 1667 + "string.prototype.matchall": "^4.0.2", 1668 + "xregexp": "^4.3.0" 1669 + }, 1670 + "dependencies": { 1671 + "array-includes": { 1672 + "version": "3.1.1", 1673 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", 1674 + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", 1675 + "dev": true, 1676 + "requires": { 1677 + "define-properties": "^1.1.3", 1678 + "es-abstract": "^1.17.0", 1679 + "is-string": "^1.0.5" 1680 + } 1681 + }, 1682 + "doctrine": { 1683 + "version": "2.1.0", 1684 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 1685 + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 1686 + "dev": true, 1687 + "requires": { 1688 + "esutils": "^2.0.2" 1689 + } 1690 + }, 1691 + "es-abstract": { 1692 + "version": "1.17.4", 1693 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 1694 + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 1695 + "dev": true, 1696 + "requires": { 1697 + "es-to-primitive": "^1.2.1", 1698 + "function-bind": "^1.1.1", 1699 + "has": "^1.0.3", 1700 + "has-symbols": "^1.0.1", 1701 + "is-callable": "^1.1.5", 1702 + "is-regex": "^1.0.5", 1703 + "object-inspect": "^1.7.0", 1704 + "object-keys": "^1.1.1", 1705 + "object.assign": "^4.1.0", 1706 + "string.prototype.trimleft": "^2.1.1", 1707 + "string.prototype.trimright": "^2.1.1" 1708 + } 1709 + }, 1710 + "is-callable": { 1711 + "version": "1.1.5", 1712 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1713 + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1714 + "dev": true 1715 + }, 1716 + "is-regex": { 1717 + "version": "1.0.5", 1718 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1719 + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1720 + "dev": true, 1721 + "requires": { 1722 + "has": "^1.0.3" 1723 + } 1724 + }, 1725 + "resolve": { 1726 + "version": "1.15.1", 1727 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", 1728 + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", 1729 + "dev": true, 1730 + "requires": { 1731 + "path-parse": "^1.0.6" 1732 + } 1733 + }, 1734 + "semver": { 1735 + "version": "6.3.0", 1736 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1737 + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1738 + "dev": true 1739 + }, 1740 + "string.prototype.trimleft": { 1741 + "version": "2.1.1", 1742 + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 1743 + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 1744 + "dev": true, 1745 + "requires": { 1746 + "define-properties": "^1.1.3", 1747 + "function-bind": "^1.1.1" 1748 + } 1749 + }, 1750 + "string.prototype.trimright": { 1751 + "version": "2.1.1", 1752 + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 1753 + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 1754 + "dev": true, 1755 + "requires": { 1756 + "define-properties": "^1.1.3", 1757 + "function-bind": "^1.1.1" 1758 + } 1759 + } 1760 + } 1761 + }, 1762 + "eslint-plugin-standard": { 1763 + "version": "4.0.1", 1764 + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", 1765 + "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", 1766 + "dev": true 1767 + }, 1768 + "eslint-scope": { 1769 + "version": "5.0.0", 1770 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 1771 + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 1772 + "dev": true, 1773 + "requires": { 1774 + "esrecurse": "^4.1.0", 1775 + "estraverse": "^4.1.1" 1776 + } 1777 + }, 1778 + "eslint-utils": { 1779 + "version": "1.4.3", 1780 + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 1781 + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 1782 + "dev": true, 1783 + "requires": { 1784 + "eslint-visitor-keys": "^1.1.0" 1785 + }, 1786 + "dependencies": { 1787 + "eslint-visitor-keys": { 1788 + "version": "1.1.0", 1789 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 1790 + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 1791 + "dev": true 1792 + } 1793 + } 1794 + }, 1795 + "eslint-visitor-keys": { 1796 + "version": "1.1.0", 1797 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 1798 + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 1799 + "dev": true 1800 + }, 1801 + "espree": { 1802 + "version": "6.2.1", 1803 + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", 1804 + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", 1805 + "dev": true, 1806 + "requires": { 1807 + "acorn": "^7.1.1", 1808 + "acorn-jsx": "^5.2.0", 1809 + "eslint-visitor-keys": "^1.1.0" 1810 + } 1811 + }, 1812 + "esprima": { 1813 + "version": "4.0.1", 1814 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1815 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1816 + "dev": true 1817 + }, 1818 + "esquery": { 1819 + "version": "1.1.0", 1820 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", 1821 + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", 1822 + "dev": true, 1823 + "requires": { 1824 + "estraverse": "^4.0.0" 1825 + } 1826 + }, 1827 + "esrecurse": { 1828 + "version": "4.2.1", 1829 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 1830 + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 1831 + "dev": true, 1832 + "requires": { 1833 + "estraverse": "^4.1.0" 1834 + } 1835 + }, 1836 + "estraverse": { 1837 + "version": "4.3.0", 1838 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 1839 + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 1840 + "dev": true 1841 + }, 1842 + "esutils": { 1843 + "version": "2.0.3", 1844 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1845 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1846 + "dev": true 1847 + }, 1848 + "event-stream": { 1849 + "version": "0.5.3", 1850 + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.5.3.tgz", 1851 + "integrity": "sha1-t3uTCfcQet3+q2PwwOr9jbC9jBw=", 1852 + "requires": { 1853 + "optimist": "0.2" 1854 + }, 1855 + "dependencies": { 1856 + "optimist": { 1857 + "version": "0.2.8", 1858 + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", 1859 + "integrity": "sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE=", 1860 + "requires": { 1861 + "wordwrap": ">=0.0.1 <0.1.0" 1862 + } 1863 + } 1864 + } 1865 + }, 1866 + "event-target-shim": { 1867 + "version": "5.0.1", 1868 + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1869 + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 1870 + }, 1871 + "eventemitter2": { 1872 + "version": "0.4.14", 1873 + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 1874 + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" 1875 + }, 1876 + "expand-brackets": { 1877 + "version": "2.1.4", 1878 + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 1879 + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 1880 + "requires": { 1881 + "debug": "^2.3.3", 1882 + "define-property": "^0.2.5", 1883 + "extend-shallow": "^2.0.1", 1884 + "posix-character-classes": "^0.1.0", 1885 + "regex-not": "^1.0.0", 1886 + "snapdragon": "^0.8.1", 1887 + "to-regex": "^3.0.1" 1888 + }, 1889 + "dependencies": { 1890 + "debug": { 1891 + "version": "2.6.9", 1892 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1893 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1894 + "requires": { 1895 + "ms": "2.0.0" 1896 + } 1897 + }, 1898 + "define-property": { 1899 + "version": "0.2.5", 1900 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 1901 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 1902 + "requires": { 1903 + "is-descriptor": "^0.1.0" 1904 + } 1905 + }, 1906 + "extend-shallow": { 1907 + "version": "2.0.1", 1908 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1909 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1910 + "requires": { 1911 + "is-extendable": "^0.1.0" 1912 + } 1913 + } 1914 + } 1915 + }, 1916 + "extend-shallow": { 1917 + "version": "3.0.2", 1918 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 1919 + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 1920 + "requires": { 1921 + "assign-symbols": "^1.0.0", 1922 + "is-extendable": "^1.0.1" 1923 + }, 1924 + "dependencies": { 1925 + "is-extendable": { 1926 + "version": "1.0.1", 1927 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 1928 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 1929 + "requires": { 1930 + "is-plain-object": "^2.0.4" 1931 + } 1932 + } 1933 + } 1934 + }, 1935 + "external-editor": { 1936 + "version": "3.1.0", 1937 + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 1938 + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 1939 + "dev": true, 1940 + "requires": { 1941 + "chardet": "^0.7.0", 1942 + "iconv-lite": "^0.4.24", 1943 + "tmp": "^0.0.33" 1944 + } 1945 + }, 1946 + "extglob": { 1947 + "version": "2.0.4", 1948 + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 1949 + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 1950 + "requires": { 1951 + "array-unique": "^0.3.2", 1952 + "define-property": "^1.0.0", 1953 + "expand-brackets": "^2.1.4", 1954 + "extend-shallow": "^2.0.1", 1955 + "fragment-cache": "^0.2.1", 1956 + "regex-not": "^1.0.0", 1957 + "snapdragon": "^0.8.1", 1958 + "to-regex": "^3.0.1" 1959 + }, 1960 + "dependencies": { 1961 + "define-property": { 1962 + "version": "1.0.0", 1963 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 1964 + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 1965 + "requires": { 1966 + "is-descriptor": "^1.0.0" 1967 + } 1968 + }, 1969 + "extend-shallow": { 1970 + "version": "2.0.1", 1971 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1972 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1973 + "requires": { 1974 + "is-extendable": "^0.1.0" 1975 + } 1976 + }, 1977 + "is-accessor-descriptor": { 1978 + "version": "1.0.0", 1979 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 1980 + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 1981 + "requires": { 1982 + "kind-of": "^6.0.0" 1983 + } 1984 + }, 1985 + "is-data-descriptor": { 1986 + "version": "1.0.0", 1987 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 1988 + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 1989 + "requires": { 1990 + "kind-of": "^6.0.0" 1991 + } 1992 + }, 1993 + "is-descriptor": { 1994 + "version": "1.0.2", 1995 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 1996 + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 1997 + "requires": { 1998 + "is-accessor-descriptor": "^1.0.0", 1999 + "is-data-descriptor": "^1.0.0", 2000 + "kind-of": "^6.0.2" 2001 + } 2002 + } 2003 + } 2004 + }, 2005 + "eyes": { 2006 + "version": "0.1.8", 2007 + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 2008 + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 2009 + }, 2010 + "fast-deep-equal": { 2011 + "version": "3.1.1", 2012 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 2013 + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 2014 + "dev": true 2015 + }, 2016 + "fast-diff": { 2017 + "version": "1.2.0", 2018 + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", 2019 + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", 2020 + "dev": true 2021 + }, 2022 + "fast-json-stable-stringify": { 2023 + "version": "2.1.0", 2024 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2025 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2026 + "dev": true 2027 + }, 2028 + "fast-levenshtein": { 2029 + "version": "2.0.6", 2030 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2031 + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 2032 + "dev": true 2033 + }, 2034 + "ffmpeg-binaries": { 2035 + "version": "3.2.2", 2036 + "resolved": "https://registry.npmjs.org/ffmpeg-binaries/-/ffmpeg-binaries-3.2.2.tgz", 2037 + "integrity": "sha1-Nw8wIO9rTbpipVGkJcY01sdaOiE=" 2038 + }, 2039 + "ffprobe": { 2040 + "version": "1.1.0", 2041 + "resolved": "https://registry.npmjs.org/ffprobe/-/ffprobe-1.1.0.tgz", 2042 + "integrity": "sha1-9k8OpE4zyA/B967+MfxLNwfSrM4=", 2043 + "requires": { 2044 + "JSONStream": "^1.0.7", 2045 + "bl": "^1.0.0", 2046 + "deferential": "^1.0.0" 2047 + } 2048 + }, 2049 + "ffprobe-static": { 2050 + "version": "3.0.0", 2051 + "resolved": "https://registry.npmjs.org/ffprobe-static/-/ffprobe-static-3.0.0.tgz", 2052 + "integrity": "sha512-LZ1Sj4RHS95t/ReZtRbCmMEWDDl7cfIMwmhNgCZcdtOgRlAHaGGOupoc166Q9AV+T7lXnUvu5HYczcsn69c6fw==" 2053 + }, 2054 + "figures": { 2055 + "version": "3.2.0", 2056 + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", 2057 + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", 2058 + "dev": true, 2059 + "requires": { 2060 + "escape-string-regexp": "^1.0.5" 2061 + } 2062 + }, 2063 + "file-entry-cache": { 2064 + "version": "5.0.1", 2065 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 2066 + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 2067 + "dev": true, 2068 + "requires": { 2069 + "flat-cache": "^2.0.1" 2070 + } 2071 + }, 2072 + "file-uri-to-path": { 2073 + "version": "1.0.0", 2074 + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 2075 + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 2076 + }, 2077 + "fill-range": { 2078 + "version": "4.0.0", 2079 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 2080 + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 2081 + "requires": { 2082 + "extend-shallow": "^2.0.1", 2083 + "is-number": "^3.0.0", 2084 + "repeat-string": "^1.6.1", 2085 + "to-regex-range": "^2.1.0" 2086 + }, 2087 + "dependencies": { 2088 + "extend-shallow": { 2089 + "version": "2.0.1", 2090 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2091 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2092 + "requires": { 2093 + "is-extendable": "^0.1.0" 2094 + } 2095 + } 2096 + } 2097 + }, 2098 + "find-up": { 2099 + "version": "2.1.0", 2100 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2101 + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2102 + "dev": true, 2103 + "requires": { 2104 + "locate-path": "^2.0.0" 2105 + } 2106 + }, 2107 + "flat-cache": { 2108 + "version": "2.0.1", 2109 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 2110 + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 2111 + "dev": true, 2112 + "requires": { 2113 + "flatted": "^2.0.0", 2114 + "rimraf": "2.6.3", 2115 + "write": "1.0.3" 2116 + } 2117 + }, 2118 + "flatiron": { 2119 + "version": "0.4.3", 2120 + "resolved": "https://registry.npmjs.org/flatiron/-/flatiron-0.4.3.tgz", 2121 + "integrity": "sha1-JIz3mj2n19w3nioRySonGcu1QPY=", 2122 + "requires": { 2123 + "broadway": "~0.3.2", 2124 + "director": "1.2.7", 2125 + "optimist": "0.6.0", 2126 + "prompt": "0.2.14" 2127 + }, 2128 + "dependencies": { 2129 + "optimist": { 2130 + "version": "0.6.0", 2131 + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.0.tgz", 2132 + "integrity": "sha1-aUJIJvNAX3nxQub8PZrljU27kgA=", 2133 + "requires": { 2134 + "minimist": "~0.0.1", 2135 + "wordwrap": "~0.0.2" 2136 + } 2137 + } 2138 + } 2139 + }, 2140 + "flatted": { 2141 + "version": "2.0.1", 2142 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 2143 + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 2144 + "dev": true 2145 + }, 2146 + "follow-redirects": { 2147 + "version": "1.5.10", 2148 + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 2149 + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 2150 + "requires": { 2151 + "debug": "=3.1.0" 2152 + } 2153 + }, 2154 + "for-in": { 2155 + "version": "1.0.2", 2156 + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 2157 + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 2158 + }, 2159 + "forever": { 2160 + "version": "2.0.0", 2161 + "resolved": "https://registry.npmjs.org/forever/-/forever-2.0.0.tgz", 2162 + "integrity": "sha512-lPq2AJackIVZT7Zey7XmRgv6vLShadqf4GYAkdS1+BxI+yTor/xiy1CzGPMWYF98lBs5dFClIn4PJ/EtqScBcQ==", 2163 + "requires": { 2164 + "async": "^1.5.2", 2165 + "cliff": "^0.1.10", 2166 + "clone": "^2.1.2", 2167 + "colors": "^0.6.2", 2168 + "flatiron": "~0.4.2", 2169 + "forever-monitor": "^2.0.0", 2170 + "mkdirp": "^0.5.1", 2171 + "nconf": "^0.10.0", 2172 + "nssocket": "^0.6.0", 2173 + "object-assign": "^4.1.1", 2174 + "optimist": "^0.6.1", 2175 + "path-is-absolute": "^2.0.0", 2176 + "prettyjson": "^1.2.1", 2177 + "shush": "^1.0.0", 2178 + "utile": "~0.3.0", 2179 + "winston": "~0.8.1" 2180 + }, 2181 + "dependencies": { 2182 + "path-is-absolute": { 2183 + "version": "2.0.0", 2184 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-2.0.0.tgz", 2185 + "integrity": "sha512-ajROpjq1SLxJZsgSVCcVIt+ZebVH+PwJtPnVESjfg6JKwJGwAgHRC3zIcjvI0LnecjIHCJhtfNZ/Y/RregqyXg==" 2186 + } 2187 + } 2188 + }, 2189 + "forever-monitor": { 2190 + "version": "2.0.0", 2191 + "resolved": "https://registry.npmjs.org/forever-monitor/-/forever-monitor-2.0.0.tgz", 2192 + "integrity": "sha512-5tMNrrDjeI2tkS+m+fxETWXaUIYEarY9Sy2pw9AOq9sVENA/8B7pl3xVAQTG0fND8ypet3rQhg+G4D4f+fVw2w==", 2193 + "requires": { 2194 + "broadway": "~0.3.6", 2195 + "chokidar": "^2.1.8", 2196 + "minimatch": "^3.0.4", 2197 + "ps-tree": "0.0.x", 2198 + "utile": "^0.3.0" 2199 + } 2200 + }, 2201 + "form-data": { 2202 + "version": "3.0.0", 2203 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", 2204 + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", 2205 + "requires": { 2206 + "asynckit": "^0.4.0", 2207 + "combined-stream": "^1.0.8", 2208 + "mime-types": "^2.1.12" 2209 + } 2210 + }, 2211 + "fragment-cache": { 2212 + "version": "0.2.1", 2213 + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 2214 + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 2215 + "requires": { 2216 + "map-cache": "^0.2.2" 2217 + } 2218 + }, 2219 + "fs-minipass": { 2220 + "version": "1.2.7", 2221 + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 2222 + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 2223 + "optional": true, 2224 + "requires": { 2225 + "minipass": "^2.6.0" 2226 + } 2227 + }, 2228 + "fs.realpath": { 2229 + "version": "1.0.0", 2230 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2231 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 2232 + }, 2233 + "fsevents": { 2234 + "version": "1.2.11", 2235 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", 2236 + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", 2237 + "optional": true, 2238 + "requires": { 2239 + "bindings": "^1.5.0", 2240 + "nan": "^2.12.1", 2241 + "node-pre-gyp": "*" 2242 + }, 2243 + "dependencies": { 2244 + "abbrev": { 2245 + "version": "1.1.1", 2246 + "bundled": true, 2247 + "optional": true 2248 + }, 2249 + "ansi-regex": { 2250 + "version": "2.1.1", 2251 + "bundled": true, 2252 + "optional": true 2253 + }, 2254 + "aproba": { 2255 + "version": "1.2.0", 2256 + "bundled": true, 2257 + "optional": true 2258 + }, 2259 + "are-we-there-yet": { 2260 + "version": "1.1.5", 2261 + "bundled": true, 2262 + "optional": true, 2263 + "requires": { 2264 + "delegates": "^1.0.0", 2265 + "readable-stream": "^2.0.6" 2266 + } 2267 + }, 2268 + "balanced-match": { 2269 + "version": "1.0.0", 2270 + "bundled": true, 2271 + "optional": true 2272 + }, 2273 + "bindings": { 2274 + "version": "1.5.0", 2275 + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 2276 + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 2277 + "optional": true, 2278 + "requires": { 2279 + "file-uri-to-path": "1.0.0" 2280 + } 2281 + }, 2282 + "brace-expansion": { 2283 + "version": "1.1.11", 2284 + "bundled": true, 2285 + "optional": true, 2286 + "requires": { 2287 + "balanced-match": "^1.0.0", 2288 + "concat-map": "0.0.1" 2289 + } 2290 + }, 2291 + "chownr": { 2292 + "version": "1.1.3", 2293 + "bundled": true, 2294 + "optional": true 2295 + }, 2296 + "code-point-at": { 2297 + "version": "1.1.0", 2298 + "bundled": true, 2299 + "optional": true 2300 + }, 2301 + "concat-map": { 2302 + "version": "0.0.1", 2303 + "bundled": true, 2304 + "optional": true 2305 + }, 2306 + "console-control-strings": { 2307 + "version": "1.1.0", 2308 + "bundled": true, 2309 + "optional": true 2310 + }, 2311 + "core-util-is": { 2312 + "version": "1.0.2", 2313 + "bundled": true, 2314 + "optional": true 2315 + }, 2316 + "debug": { 2317 + "version": "3.2.6", 2318 + "bundled": true, 2319 + "optional": true, 2320 + "requires": { 2321 + "ms": "^2.1.1" 2322 + } 2323 + }, 2324 + "deep-extend": { 2325 + "version": "0.6.0", 2326 + "bundled": true, 2327 + "optional": true 2328 + }, 2329 + "delegates": { 2330 + "version": "1.0.0", 2331 + "bundled": true, 2332 + "optional": true 2333 + }, 2334 + "detect-libc": { 2335 + "version": "1.0.3", 2336 + "bundled": true, 2337 + "optional": true 2338 + }, 2339 + "fs-minipass": { 2340 + "version": "1.2.7", 2341 + "bundled": true, 2342 + "optional": true, 2343 + "requires": { 2344 + "minipass": "^2.6.0" 2345 + } 2346 + }, 2347 + "fs.realpath": { 2348 + "version": "1.0.0", 2349 + "bundled": true, 2350 + "optional": true 2351 + }, 2352 + "gauge": { 2353 + "version": "2.7.4", 2354 + "bundled": true, 2355 + "optional": true, 2356 + "requires": { 2357 + "aproba": "^1.0.3", 2358 + "console-control-strings": "^1.0.0", 2359 + "has-unicode": "^2.0.0", 2360 + "object-assign": "^4.1.0", 2361 + "signal-exit": "^3.0.0", 2362 + "string-width": "^1.0.1", 2363 + "strip-ansi": "^3.0.1", 2364 + "wide-align": "^1.1.0" 2365 + } 2366 + }, 2367 + "glob": { 2368 + "version": "7.1.6", 2369 + "bundled": true, 2370 + "optional": true, 2371 + "requires": { 2372 + "fs.realpath": "^1.0.0", 2373 + "inflight": "^1.0.4", 2374 + "inherits": "2", 2375 + "minimatch": "^3.0.4", 2376 + "once": "^1.3.0", 2377 + "path-is-absolute": "^1.0.0" 2378 + } 2379 + }, 2380 + "has-unicode": { 2381 + "version": "2.0.1", 2382 + "bundled": true, 2383 + "optional": true 2384 + }, 2385 + "iconv-lite": { 2386 + "version": "0.4.24", 2387 + "bundled": true, 2388 + "optional": true, 2389 + "requires": { 2390 + "safer-buffer": ">= 2.1.2 < 3" 2391 + } 2392 + }, 2393 + "ignore-walk": { 2394 + "version": "3.0.3", 2395 + "bundled": true, 2396 + "optional": true, 2397 + "requires": { 2398 + "minimatch": "^3.0.4" 2399 + } 2400 + }, 2401 + "inflight": { 2402 + "version": "1.0.6", 2403 + "bundled": true, 2404 + "optional": true, 2405 + "requires": { 2406 + "once": "^1.3.0", 2407 + "wrappy": "1" 2408 + } 2409 + }, 2410 + "inherits": { 2411 + "version": "2.0.4", 2412 + "bundled": true, 2413 + "optional": true 2414 + }, 2415 + "ini": { 2416 + "version": "1.3.5", 2417 + "bundled": true, 2418 + "optional": true 2419 + }, 2420 + "is-fullwidth-code-point": { 2421 + "version": "1.0.0", 2422 + "bundled": true, 2423 + "optional": true, 2424 + "requires": { 2425 + "number-is-nan": "^1.0.0" 2426 + } 2427 + }, 2428 + "isarray": { 2429 + "version": "1.0.0", 2430 + "bundled": true, 2431 + "optional": true 2432 + }, 2433 + "minimatch": { 2434 + "version": "3.0.4", 2435 + "bundled": true, 2436 + "optional": true, 2437 + "requires": { 2438 + "brace-expansion": "^1.1.7" 2439 + } 2440 + }, 2441 + "minimist": { 2442 + "version": "0.0.8", 2443 + "bundled": true, 2444 + "optional": true 2445 + }, 2446 + "minipass": { 2447 + "version": "2.9.0", 2448 + "bundled": true, 2449 + "optional": true, 2450 + "requires": { 2451 + "safe-buffer": "^5.1.2", 2452 + "yallist": "^3.0.0" 2453 + } 2454 + }, 2455 + "minizlib": { 2456 + "version": "1.3.3", 2457 + "bundled": true, 2458 + "optional": true, 2459 + "requires": { 2460 + "minipass": "^2.9.0" 2461 + } 2462 + }, 2463 + "mkdirp": { 2464 + "version": "0.5.1", 2465 + "bundled": true, 2466 + "optional": true, 2467 + "requires": { 2468 + "minimist": "0.0.8" 2469 + } 2470 + }, 2471 + "ms": { 2472 + "version": "2.1.2", 2473 + "bundled": true, 2474 + "optional": true 2475 + }, 2476 + "needle": { 2477 + "version": "2.4.0", 2478 + "bundled": true, 2479 + "optional": true, 2480 + "requires": { 2481 + "debug": "^3.2.6", 2482 + "iconv-lite": "^0.4.4", 2483 + "sax": "^1.2.4" 2484 + } 2485 + }, 2486 + "node-pre-gyp": { 2487 + "version": "0.14.0", 2488 + "bundled": true, 2489 + "optional": true, 2490 + "requires": { 2491 + "detect-libc": "^1.0.2", 2492 + "mkdirp": "^0.5.1", 2493 + "needle": "^2.2.1", 2494 + "nopt": "^4.0.1", 2495 + "npm-packlist": "^1.1.6", 2496 + "npmlog": "^4.0.2", 2497 + "rc": "^1.2.7", 2498 + "rimraf": "^2.6.1", 2499 + "semver": "^5.3.0", 2500 + "tar": "^4.4.2" 2501 + } 2502 + }, 2503 + "nopt": { 2504 + "version": "4.0.1", 2505 + "bundled": true, 2506 + "optional": true, 2507 + "requires": { 2508 + "abbrev": "1", 2509 + "osenv": "^0.1.4" 2510 + } 2511 + }, 2512 + "npm-bundled": { 2513 + "version": "1.1.1", 2514 + "bundled": true, 2515 + "optional": true, 2516 + "requires": { 2517 + "npm-normalize-package-bin": "^1.0.1" 2518 + } 2519 + }, 2520 + "npm-normalize-package-bin": { 2521 + "version": "1.0.1", 2522 + "bundled": true, 2523 + "optional": true 2524 + }, 2525 + "npm-packlist": { 2526 + "version": "1.4.7", 2527 + "bundled": true, 2528 + "optional": true, 2529 + "requires": { 2530 + "ignore-walk": "^3.0.1", 2531 + "npm-bundled": "^1.0.1" 2532 + } 2533 + }, 2534 + "npmlog": { 2535 + "version": "4.1.2", 2536 + "bundled": true, 2537 + "optional": true, 2538 + "requires": { 2539 + "are-we-there-yet": "~1.1.2", 2540 + "console-control-strings": "~1.1.0", 2541 + "gauge": "~2.7.3", 2542 + "set-blocking": "~2.0.0" 2543 + } 2544 + }, 2545 + "number-is-nan": { 2546 + "version": "1.0.1", 2547 + "bundled": true, 2548 + "optional": true 2549 + }, 2550 + "object-assign": { 2551 + "version": "4.1.1", 2552 + "bundled": true, 2553 + "optional": true 2554 + }, 2555 + "once": { 2556 + "version": "1.4.0", 2557 + "bundled": true, 2558 + "optional": true, 2559 + "requires": { 2560 + "wrappy": "1" 2561 + } 2562 + }, 2563 + "os-homedir": { 2564 + "version": "1.0.2", 2565 + "bundled": true, 2566 + "optional": true 2567 + }, 2568 + "os-tmpdir": { 2569 + "version": "1.0.2", 2570 + "bundled": true, 2571 + "optional": true 2572 + }, 2573 + "osenv": { 2574 + "version": "0.1.5", 2575 + "bundled": true, 2576 + "optional": true, 2577 + "requires": { 2578 + "os-homedir": "^1.0.0", 2579 + "os-tmpdir": "^1.0.0" 2580 + } 2581 + }, 2582 + "path-is-absolute": { 2583 + "version": "1.0.1", 2584 + "bundled": true, 2585 + "optional": true 2586 + }, 2587 + "process-nextick-args": { 2588 + "version": "2.0.1", 2589 + "bundled": true, 2590 + "optional": true 2591 + }, 2592 + "rc": { 2593 + "version": "1.2.8", 2594 + "bundled": true, 2595 + "optional": true, 2596 + "requires": { 2597 + "deep-extend": "^0.6.0", 2598 + "ini": "~1.3.0", 2599 + "minimist": "^1.2.0", 2600 + "strip-json-comments": "~2.0.1" 2601 + }, 2602 + "dependencies": { 2603 + "minimist": { 2604 + "version": "1.2.0", 2605 + "bundled": true, 2606 + "optional": true 2607 + } 2608 + } 2609 + }, 2610 + "readable-stream": { 2611 + "version": "2.3.6", 2612 + "bundled": true, 2613 + "optional": true, 2614 + "requires": { 2615 + "core-util-is": "~1.0.0", 2616 + "inherits": "~2.0.3", 2617 + "isarray": "~1.0.0", 2618 + "process-nextick-args": "~2.0.0", 2619 + "safe-buffer": "~5.1.1", 2620 + "string_decoder": "~1.1.1", 2621 + "util-deprecate": "~1.0.1" 2622 + } 2623 + }, 2624 + "rimraf": { 2625 + "version": "2.7.1", 2626 + "bundled": true, 2627 + "optional": true, 2628 + "requires": { 2629 + "glob": "^7.1.3" 2630 + } 2631 + }, 2632 + "safe-buffer": { 2633 + "version": "5.1.2", 2634 + "bundled": true, 2635 + "optional": true 2636 + }, 2637 + "safer-buffer": { 2638 + "version": "2.1.2", 2639 + "bundled": true, 2640 + "optional": true 2641 + }, 2642 + "sax": { 2643 + "version": "1.2.4", 2644 + "bundled": true, 2645 + "optional": true 2646 + }, 2647 + "semver": { 2648 + "version": "5.7.1", 2649 + "bundled": true, 2650 + "optional": true 2651 + }, 2652 + "set-blocking": { 2653 + "version": "2.0.0", 2654 + "bundled": true, 2655 + "optional": true 2656 + }, 2657 + "signal-exit": { 2658 + "version": "3.0.2", 2659 + "bundled": true, 2660 + "optional": true 2661 + }, 2662 + "string-width": { 2663 + "version": "1.0.2", 2664 + "bundled": true, 2665 + "optional": true, 2666 + "requires": { 2667 + "code-point-at": "^1.0.0", 2668 + "is-fullwidth-code-point": "^1.0.0", 2669 + "strip-ansi": "^3.0.0" 2670 + } 2671 + }, 2672 + "string_decoder": { 2673 + "version": "1.1.1", 2674 + "bundled": true, 2675 + "optional": true, 2676 + "requires": { 2677 + "safe-buffer": "~5.1.0" 2678 + } 2679 + }, 2680 + "strip-ansi": { 2681 + "version": "3.0.1", 2682 + "bundled": true, 2683 + "optional": true, 2684 + "requires": { 2685 + "ansi-regex": "^2.0.0" 2686 + } 2687 + }, 2688 + "strip-json-comments": { 2689 + "version": "2.0.1", 2690 + "bundled": true, 2691 + "optional": true 2692 + }, 2693 + "tar": { 2694 + "version": "4.4.13", 2695 + "bundled": true, 2696 + "optional": true, 2697 + "requires": { 2698 + "chownr": "^1.1.1", 2699 + "fs-minipass": "^1.2.5", 2700 + "minipass": "^2.8.6", 2701 + "minizlib": "^1.2.1", 2702 + "mkdirp": "^0.5.0", 2703 + "safe-buffer": "^5.1.2", 2704 + "yallist": "^3.0.3" 2705 + } 2706 + }, 2707 + "util-deprecate": { 2708 + "version": "1.0.2", 2709 + "bundled": true, 2710 + "optional": true 2711 + }, 2712 + "wide-align": { 2713 + "version": "1.1.3", 2714 + "bundled": true, 2715 + "optional": true, 2716 + "requires": { 2717 + "string-width": "^1.0.2 || 2" 2718 + } 2719 + }, 2720 + "wrappy": { 2721 + "version": "1.0.2", 2722 + "bundled": true, 2723 + "optional": true 2724 + }, 2725 + "yallist": { 2726 + "version": "3.1.1", 2727 + "bundled": true, 2728 + "optional": true 2729 + } 2730 + } 2731 + }, 2732 + "function-bind": { 2733 + "version": "1.1.1", 2734 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 2735 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 2736 + }, 2737 + "functional-red-black-tree": { 2738 + "version": "1.0.1", 2739 + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 2740 + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 2741 + "dev": true 2742 + }, 2743 + "gauge": { 2744 + "version": "2.7.4", 2745 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 2746 + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 2747 + "optional": true, 2748 + "requires": { 2749 + "aproba": "^1.0.3", 2750 + "console-control-strings": "^1.0.0", 2751 + "has-unicode": "^2.0.0", 2752 + "object-assign": "^4.1.0", 2753 + "signal-exit": "^3.0.0", 2754 + "string-width": "^1.0.1", 2755 + "strip-ansi": "^3.0.1", 2756 + "wide-align": "^1.1.0" 2757 + }, 2758 + "dependencies": { 2759 + "ansi-regex": { 2760 + "version": "2.1.1", 2761 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 2762 + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 2763 + "optional": true 2764 + }, 2765 + "is-fullwidth-code-point": { 2766 + "version": "1.0.0", 2767 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2768 + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2769 + "optional": true, 2770 + "requires": { 2771 + "number-is-nan": "^1.0.0" 2772 + } 2773 + }, 2774 + "object-assign": { 2775 + "version": "4.1.1", 2776 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2777 + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 2778 + "optional": true 2779 + }, 2780 + "string-width": { 2781 + "version": "1.0.2", 2782 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2783 + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2784 + "optional": true, 2785 + "requires": { 2786 + "code-point-at": "^1.0.0", 2787 + "is-fullwidth-code-point": "^1.0.0", 2788 + "strip-ansi": "^3.0.0" 2789 + } 2790 + }, 2791 + "strip-ansi": { 2792 + "version": "3.0.1", 2793 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2794 + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2795 + "optional": true, 2796 + "requires": { 2797 + "ansi-regex": "^2.0.0" 2798 + } 2799 + } 2800 + } 2801 + }, 2802 + "get-stdin": { 2803 + "version": "6.0.0", 2804 + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", 2805 + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", 2806 + "dev": true 2807 + }, 2808 + "get-value": { 2809 + "version": "2.0.6", 2810 + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 2811 + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" 2812 + }, 2813 + "glob": { 2814 + "version": "7.1.6", 2815 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 2816 + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 2817 + "dev": true, 2818 + "requires": { 2819 + "fs.realpath": "^1.0.0", 2820 + "inflight": "^1.0.4", 2821 + "inherits": "2", 2822 + "minimatch": "^3.0.4", 2823 + "once": "^1.3.0", 2824 + "path-is-absolute": "^1.0.0" 2825 + } 2826 + }, 2827 + "glob-parent": { 2828 + "version": "3.1.0", 2829 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 2830 + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 2831 + "requires": { 2832 + "is-glob": "^3.1.0", 2833 + "path-dirname": "^1.0.0" 2834 + }, 2835 + "dependencies": { 2836 + "is-glob": { 2837 + "version": "3.1.0", 2838 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 2839 + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 2840 + "requires": { 2841 + "is-extglob": "^2.1.0" 2842 + } 2843 + } 2844 + } 2845 + }, 2846 + "globals": { 2847 + "version": "12.4.0", 2848 + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", 2849 + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", 2850 + "dev": true, 2851 + "requires": { 2852 + "type-fest": "^0.8.1" 2853 + } 2854 + }, 2855 + "globalyzer": { 2856 + "version": "0.1.4", 2857 + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.4.tgz", 2858 + "integrity": "sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA==", 2859 + "dev": true 2860 + }, 2861 + "globrex": { 2862 + "version": "0.1.2", 2863 + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", 2864 + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", 2865 + "dev": true 2866 + }, 2867 + "graceful-fs": { 2868 + "version": "4.1.15", 2869 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 2870 + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 2871 + }, 2872 + "has": { 2873 + "version": "1.0.3", 2874 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 2875 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 2876 + "requires": { 2877 + "function-bind": "^1.1.1" 2878 + } 2879 + }, 2880 + "has-flag": { 2881 + "version": "3.0.0", 2882 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 2883 + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 2884 + "dev": true 2885 + }, 2886 + "has-symbols": { 2887 + "version": "1.0.1", 2888 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 2889 + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 2890 + }, 2891 + "has-unicode": { 2892 + "version": "2.0.1", 2893 + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 2894 + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 2895 + "optional": true 2896 + }, 2897 + "has-value": { 2898 + "version": "1.0.0", 2899 + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 2900 + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 2901 + "requires": { 2902 + "get-value": "^2.0.6", 2903 + "has-values": "^1.0.0", 2904 + "isobject": "^3.0.0" 2905 + } 2906 + }, 2907 + "has-values": { 2908 + "version": "1.0.0", 2909 + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 2910 + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 2911 + "requires": { 2912 + "is-number": "^3.0.0", 2913 + "kind-of": "^4.0.0" 2914 + }, 2915 + "dependencies": { 2916 + "kind-of": { 2917 + "version": "4.0.0", 2918 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 2919 + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 2920 + "requires": { 2921 + "is-buffer": "^1.1.5" 2922 + } 2923 + } 2924 + } 2925 + }, 2926 + "hosted-git-info": { 2927 + "version": "2.8.8", 2928 + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", 2929 + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", 2930 + "dev": true 2931 + }, 2932 + "i": { 2933 + "version": "0.3.6", 2934 + "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", 2935 + "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" 2936 + }, 2937 + "iconv-lite": { 2938 + "version": "0.4.24", 2939 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 2940 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 2941 + "requires": { 2942 + "safer-buffer": ">= 2.1.2 < 3" 2943 + } 2944 + }, 2945 + "ignore": { 2946 + "version": "4.0.6", 2947 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 2948 + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 2949 + "dev": true 2950 + }, 2951 + "ignore-walk": { 2952 + "version": "3.0.3", 2953 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 2954 + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 2955 + "optional": true, 2956 + "requires": { 2957 + "minimatch": "^3.0.4" 2958 + } 2959 + }, 2960 + "import-fresh": { 2961 + "version": "3.2.1", 2962 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 2963 + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 2964 + "dev": true, 2965 + "requires": { 2966 + "parent-module": "^1.0.0", 2967 + "resolve-from": "^4.0.0" 2968 + } 2969 + }, 2970 + "imurmurhash": { 2971 + "version": "0.1.4", 2972 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 2973 + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 2974 + "dev": true 2975 + }, 2976 + "inflight": { 2977 + "version": "1.0.6", 2978 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2979 + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 2980 + "requires": { 2981 + "once": "^1.3.0", 2982 + "wrappy": "1" 2983 + } 2984 + }, 2985 + "inherits": { 2986 + "version": "2.0.3", 2987 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 2988 + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 2989 + }, 2990 + "ini": { 2991 + "version": "1.3.5", 2992 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 2993 + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 2994 + }, 2995 + "inquirer": { 2996 + "version": "7.1.0", 2997 + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 2998 + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 2999 + "dev": true, 3000 + "requires": { 3001 + "ansi-escapes": "^4.2.1", 3002 + "chalk": "^3.0.0", 3003 + "cli-cursor": "^3.1.0", 3004 + "cli-width": "^2.0.0", 3005 + "external-editor": "^3.0.3", 3006 + "figures": "^3.0.0", 3007 + "lodash": "^4.17.15", 3008 + "mute-stream": "0.0.8", 3009 + "run-async": "^2.4.0", 3010 + "rxjs": "^6.5.3", 3011 + "string-width": "^4.1.0", 3012 + "strip-ansi": "^6.0.0", 3013 + "through": "^2.3.6" 3014 + }, 3015 + "dependencies": { 3016 + "ansi-styles": { 3017 + "version": "4.2.1", 3018 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 3019 + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 3020 + "dev": true, 3021 + "requires": { 3022 + "@types/color-name": "^1.1.1", 3023 + "color-convert": "^2.0.1" 3024 + } 3025 + }, 3026 + "chalk": { 3027 + "version": "3.0.0", 3028 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 3029 + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 3030 + "dev": true, 3031 + "requires": { 3032 + "ansi-styles": "^4.1.0", 3033 + "supports-color": "^7.1.0" 3034 + } 3035 + }, 3036 + "color-convert": { 3037 + "version": "2.0.1", 3038 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 3039 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 3040 + "dev": true, 3041 + "requires": { 3042 + "color-name": "~1.1.4" 3043 + } 3044 + }, 3045 + "color-name": { 3046 + "version": "1.1.4", 3047 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3048 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3049 + "dev": true 3050 + }, 3051 + "has-flag": { 3052 + "version": "4.0.0", 3053 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3054 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3055 + "dev": true 3056 + }, 3057 + "mute-stream": { 3058 + "version": "0.0.8", 3059 + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 3060 + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 3061 + "dev": true 3062 + }, 3063 + "strip-ansi": { 3064 + "version": "6.0.0", 3065 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 3066 + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 3067 + "dev": true, 3068 + "requires": { 3069 + "ansi-regex": "^5.0.0" 3070 + } 3071 + }, 3072 + "supports-color": { 3073 + "version": "7.1.0", 3074 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 3075 + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 3076 + "dev": true, 3077 + "requires": { 3078 + "has-flag": "^4.0.0" 3079 + } 3080 + } 3081 + } 3082 + }, 3083 + "internal-slot": { 3084 + "version": "1.0.2", 3085 + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", 3086 + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", 3087 + "dev": true, 3088 + "requires": { 3089 + "es-abstract": "^1.17.0-next.1", 3090 + "has": "^1.0.3", 3091 + "side-channel": "^1.0.2" 3092 + } 3093 + }, 3094 + "invert-kv": { 3095 + "version": "1.0.0", 3096 + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 3097 + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 3098 + }, 3099 + "is-accessor-descriptor": { 3100 + "version": "0.1.6", 3101 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 3102 + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 3103 + "requires": { 3104 + "kind-of": "^3.0.2" 3105 + }, 3106 + "dependencies": { 3107 + "kind-of": { 3108 + "version": "3.2.2", 3109 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3110 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3111 + "requires": { 3112 + "is-buffer": "^1.1.5" 3113 + } 3114 + } 3115 + } 3116 + }, 3117 + "is-arguments": { 3118 + "version": "1.0.4", 3119 + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 3120 + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" 3121 + }, 3122 + "is-arrayish": { 3123 + "version": "0.2.1", 3124 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 3125 + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 3126 + "dev": true 3127 + }, 3128 + "is-bigint": { 3129 + "version": "1.0.0", 3130 + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", 3131 + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==" 3132 + }, 3133 + "is-binary-path": { 3134 + "version": "1.0.1", 3135 + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 3136 + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 3137 + "requires": { 3138 + "binary-extensions": "^1.0.0" 3139 + } 3140 + }, 3141 + "is-boolean-object": { 3142 + "version": "1.0.1", 3143 + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", 3144 + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==" 3145 + }, 3146 + "is-buffer": { 3147 + "version": "1.1.6", 3148 + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 3149 + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 3150 + }, 3151 + "is-callable": { 3152 + "version": "1.1.4", 3153 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 3154 + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 3155 + }, 3156 + "is-data-descriptor": { 3157 + "version": "0.1.4", 3158 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 3159 + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 3160 + "requires": { 3161 + "kind-of": "^3.0.2" 3162 + }, 3163 + "dependencies": { 3164 + "kind-of": { 3165 + "version": "3.2.2", 3166 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3167 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3168 + "requires": { 3169 + "is-buffer": "^1.1.5" 3170 + } 3171 + } 3172 + } 3173 + }, 3174 + "is-date-object": { 3175 + "version": "1.0.1", 3176 + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 3177 + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 3178 + }, 3179 + "is-descriptor": { 3180 + "version": "0.1.6", 3181 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 3182 + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 3183 + "requires": { 3184 + "is-accessor-descriptor": "^0.1.6", 3185 + "is-data-descriptor": "^0.1.4", 3186 + "kind-of": "^5.0.0" 3187 + }, 3188 + "dependencies": { 3189 + "kind-of": { 3190 + "version": "5.1.0", 3191 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 3192 + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 3193 + } 3194 + } 3195 + }, 3196 + "is-extendable": { 3197 + "version": "0.1.1", 3198 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 3199 + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 3200 + }, 3201 + "is-extglob": { 3202 + "version": "2.1.1", 3203 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3204 + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 3205 + }, 3206 + "is-fullwidth-code-point": { 3207 + "version": "3.0.0", 3208 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 3209 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 3210 + "dev": true 3211 + }, 3212 + "is-glob": { 3213 + "version": "4.0.1", 3214 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 3215 + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 3216 + "requires": { 3217 + "is-extglob": "^2.1.1" 3218 + } 3219 + }, 3220 + "is-map": { 3221 + "version": "2.0.1", 3222 + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", 3223 + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==" 3224 + }, 3225 + "is-number": { 3226 + "version": "3.0.0", 3227 + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 3228 + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 3229 + "requires": { 3230 + "kind-of": "^3.0.2" 3231 + }, 3232 + "dependencies": { 3233 + "kind-of": { 3234 + "version": "3.2.2", 3235 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3236 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3237 + "requires": { 3238 + "is-buffer": "^1.1.5" 3239 + } 3240 + } 3241 + } 3242 + }, 3243 + "is-number-object": { 3244 + "version": "1.0.4", 3245 + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", 3246 + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" 3247 + }, 3248 + "is-plain-object": { 3249 + "version": "2.0.4", 3250 + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 3251 + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 3252 + "requires": { 3253 + "isobject": "^3.0.1" 3254 + } 3255 + }, 3256 + "is-promise": { 3257 + "version": "2.1.0", 3258 + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 3259 + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 3260 + "dev": true 3261 + }, 3262 + "is-regex": { 3263 + "version": "1.0.4", 3264 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 3265 + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 3266 + "requires": { 3267 + "has": "^1.0.1" 3268 + } 3269 + }, 3270 + "is-set": { 3271 + "version": "2.0.1", 3272 + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", 3273 + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==" 3274 + }, 3275 + "is-string": { 3276 + "version": "1.0.5", 3277 + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", 3278 + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" 3279 + }, 3280 + "is-symbol": { 3281 + "version": "1.0.3", 3282 + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 3283 + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 3284 + "requires": { 3285 + "has-symbols": "^1.0.1" 3286 + } 3287 + }, 3288 + "is-weakmap": { 3289 + "version": "2.0.1", 3290 + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 3291 + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" 3292 + }, 3293 + "is-weakset": { 3294 + "version": "2.0.1", 3295 + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", 3296 + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==" 3297 + }, 3298 + "is-windows": { 3299 + "version": "1.0.2", 3300 + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 3301 + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 3302 + }, 3303 + "isarray": { 3304 + "version": "1.0.0", 3305 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 3306 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 3307 + }, 3308 + "isexe": { 3309 + "version": "2.0.0", 3310 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3311 + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 3312 + "dev": true 3313 + }, 3314 + "isobject": { 3315 + "version": "3.0.1", 3316 + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 3317 + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 3318 + }, 3319 + "isstream": { 3320 + "version": "0.1.2", 3321 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 3322 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 3323 + }, 3324 + "js-tokens": { 3325 + "version": "4.0.0", 3326 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3327 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 3328 + "dev": true 3329 + }, 3330 + "js-yaml": { 3331 + "version": "3.13.1", 3332 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 3333 + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 3334 + "dev": true, 3335 + "requires": { 3336 + "argparse": "^1.0.7", 3337 + "esprima": "^4.0.0" 3338 + } 3339 + }, 3340 + "json-schema-traverse": { 3341 + "version": "0.4.1", 3342 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3343 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 3344 + "dev": true 3345 + }, 3346 + "json-stable-stringify-without-jsonify": { 3347 + "version": "1.0.1", 3348 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 3349 + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 3350 + "dev": true 3351 + }, 3352 + "json5": { 3353 + "version": "1.0.1", 3354 + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 3355 + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 3356 + "dev": true, 3357 + "requires": { 3358 + "minimist": "^1.2.0" 3359 + }, 3360 + "dependencies": { 3361 + "minimist": { 3362 + "version": "1.2.5", 3363 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 3364 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 3365 + "dev": true 3366 + } 3367 + } 3368 + }, 3369 + "jsonify": { 3370 + "version": "0.0.0", 3371 + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 3372 + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 3373 + }, 3374 + "jsonparse": { 3375 + "version": "1.3.1", 3376 + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 3377 + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" 3378 + }, 3379 + "jsx-ast-utils": { 3380 + "version": "2.2.3", 3381 + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", 3382 + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", 3383 + "dev": true, 3384 + "requires": { 3385 + "array-includes": "^3.0.3", 3386 + "object.assign": "^4.1.0" 3387 + } 3388 + }, 3389 + "kind-of": { 3390 + "version": "6.0.3", 3391 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", 3392 + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" 3393 + }, 3394 + "lazy": { 3395 + "version": "1.0.11", 3396 + "resolved": "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz", 3397 + "integrity": "sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=" 3398 + }, 3399 + "lcid": { 3400 + "version": "1.0.0", 3401 + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 3402 + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 3403 + "requires": { 3404 + "invert-kv": "^1.0.0" 3405 + } 3406 + }, 3407 + "levn": { 3408 + "version": "0.3.0", 3409 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 3410 + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 3411 + "dev": true, 3412 + "requires": { 3413 + "prelude-ls": "~1.1.2", 3414 + "type-check": "~0.3.2" 3415 + } 3416 + }, 3417 + "libsodium": { 3418 + "version": "0.7.6", 3419 + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.6.tgz", 3420 + "integrity": "sha512-hPb/04sEuLcTRdWDtd+xH3RXBihpmbPCsKW/Jtf4PsvdyKh+D6z2D2gvp/5BfoxseP+0FCOg66kE+0oGUE/loQ==" 3421 + }, 3422 + "libsodium-wrappers": { 3423 + "version": "0.7.6", 3424 + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.6.tgz", 3425 + "integrity": "sha512-OUO2CWW5bHdLr6hkKLHIKI4raEkZrf3QHkhXsJ1yCh6MZ3JDA7jFD3kCATNquuGSG6MjjPHQIQms0y0gBDzjQg==", 3426 + "requires": { 3427 + "libsodium": "0.7.6" 3428 + } 3429 + }, 3430 + "load-json-file": { 3431 + "version": "2.0.0", 3432 + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 3433 + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 3434 + "dev": true, 3435 + "requires": { 3436 + "graceful-fs": "^4.1.2", 3437 + "parse-json": "^2.2.0", 3438 + "pify": "^2.0.0", 3439 + "strip-bom": "^3.0.0" 3440 + } 3441 + }, 3442 + "locate-path": { 3443 + "version": "2.0.0", 3444 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 3445 + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 3446 + "dev": true, 3447 + "requires": { 3448 + "p-locate": "^2.0.0", 3449 + "path-exists": "^3.0.0" 3450 + } 3451 + }, 3452 + "lodash": { 3453 + "version": "4.17.15", 3454 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 3455 + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 3456 + "dev": true 3457 + }, 3458 + "loose-envify": { 3459 + "version": "1.4.0", 3460 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 3461 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 3462 + "dev": true, 3463 + "requires": { 3464 + "js-tokens": "^3.0.0 || ^4.0.0" 3465 + } 3466 + }, 3467 + "map-cache": { 3468 + "version": "0.2.2", 3469 + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 3470 + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" 3471 + }, 3472 + "map-visit": { 3473 + "version": "1.0.0", 3474 + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 3475 + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 3476 + "requires": { 3477 + "object-visit": "^1.0.0" 3478 + } 3479 + }, 3480 + "memory-pager": { 3481 + "version": "1.5.0", 3482 + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 3483 + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 3484 + "optional": true 3485 + }, 3486 + "micromatch": { 3487 + "version": "3.1.10", 3488 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 3489 + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 3490 + "requires": { 3491 + "arr-diff": "^4.0.0", 3492 + "array-unique": "^0.3.2", 3493 + "braces": "^2.3.1", 3494 + "define-property": "^2.0.2", 3495 + "extend-shallow": "^3.0.2", 3496 + "extglob": "^2.0.4", 3497 + "fragment-cache": "^0.2.1", 3498 + "kind-of": "^6.0.2", 3499 + "nanomatch": "^1.2.9", 3500 + "object.pick": "^1.3.0", 3501 + "regex-not": "^1.0.0", 3502 + "snapdragon": "^0.8.1", 3503 + "to-regex": "^3.0.2" 3504 + } 3505 + }, 3506 + "mime-db": { 3507 + "version": "1.43.0", 3508 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", 3509 + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 3510 + }, 3511 + "mime-types": { 3512 + "version": "2.1.26", 3513 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", 3514 + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", 3515 + "requires": { 3516 + "mime-db": "1.43.0" 3517 + } 3518 + }, 3519 + "mimic-fn": { 3520 + "version": "2.1.0", 3521 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 3522 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 3523 + "dev": true 3524 + }, 3525 + "minimatch": { 3526 + "version": "3.0.4", 3527 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 3528 + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 3529 + "requires": { 3530 + "brace-expansion": "^1.1.7" 3531 + } 3532 + }, 3533 + "minimist": { 3534 + "version": "0.0.10", 3535 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", 3536 + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" 3537 + }, 3538 + "minipass": { 3539 + "version": "2.9.0", 3540 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 3541 + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 3542 + "optional": true, 3543 + "requires": { 3544 + "safe-buffer": "^5.1.2", 3545 + "yallist": "^3.0.0" 3546 + }, 3547 + "dependencies": { 3548 + "safe-buffer": { 3549 + "version": "5.2.0", 3550 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 3551 + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 3552 + "optional": true 3553 + } 3554 + } 3555 + }, 3556 + "minizlib": { 3557 + "version": "1.3.3", 3558 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 3559 + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 3560 + "optional": true, 3561 + "requires": { 3562 + "minipass": "^2.9.0" 3563 + } 3564 + }, 3565 + "mixin-deep": { 3566 + "version": "1.3.2", 3567 + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", 3568 + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", 3569 + "requires": { 3570 + "for-in": "^1.0.2", 3571 + "is-extendable": "^1.0.1" 3572 + }, 3573 + "dependencies": { 3574 + "is-extendable": { 3575 + "version": "1.0.1", 3576 + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 3577 + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 3578 + "requires": { 3579 + "is-plain-object": "^2.0.4" 3580 + } 3581 + } 3582 + } 3583 + }, 3584 + "mkdirp": { 3585 + "version": "0.5.1", 3586 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 3587 + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 3588 + "requires": { 3589 + "minimist": "0.0.8" 3590 + }, 3591 + "dependencies": { 3592 + "minimist": { 3593 + "version": "0.0.8", 3594 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 3595 + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 3596 + } 3597 + } 3598 + }, 3599 + "mongodb": { 3600 + "version": "3.5.5", 3601 + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.5.tgz", 3602 + "integrity": "sha512-GCjDxR3UOltDq00Zcpzql6dQo1sVry60OXJY3TDmFc2SWFY6c8Gn1Ardidc5jDirvJrx2GC3knGOImKphbSL3A==", 3603 + "requires": { 3604 + "bl": "^2.2.0", 3605 + "bson": "^1.1.1", 3606 + "denque": "^1.4.1", 3607 + "require_optional": "^1.0.1", 3608 + "safe-buffer": "^5.1.2", 3609 + "saslprep": "^1.0.0" 3610 + }, 3611 + "dependencies": { 3612 + "bl": { 3613 + "version": "2.2.0", 3614 + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", 3615 + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", 3616 + "requires": { 3617 + "readable-stream": "^2.3.5", 3618 + "safe-buffer": "^5.1.1" 3619 + } 3620 + }, 3621 + "safe-buffer": { 3622 + "version": "5.2.0", 3623 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 3624 + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 3625 + } 3626 + } 3627 + }, 3628 + "ms": { 3629 + "version": "2.0.0", 3630 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3631 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 3632 + }, 3633 + "mute-stream": { 3634 + "version": "0.0.8", 3635 + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 3636 + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 3637 + }, 3638 + "nan": { 3639 + "version": "2.14.0", 3640 + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 3641 + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 3642 + }, 3643 + "nanomatch": { 3644 + "version": "1.2.13", 3645 + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", 3646 + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", 3647 + "requires": { 3648 + "arr-diff": "^4.0.0", 3649 + "array-unique": "^0.3.2", 3650 + "define-property": "^2.0.2", 3651 + "extend-shallow": "^3.0.2", 3652 + "fragment-cache": "^0.2.1", 3653 + "is-windows": "^1.0.2", 3654 + "kind-of": "^6.0.2", 3655 + "object.pick": "^1.3.0", 3656 + "regex-not": "^1.0.0", 3657 + "snapdragon": "^0.8.1", 3658 + "to-regex": "^3.0.1" 3659 + } 3660 + }, 3661 + "native-promise-only": { 3662 + "version": "0.8.1", 3663 + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", 3664 + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" 3665 + }, 3666 + "natural-compare": { 3667 + "version": "1.4.0", 3668 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3669 + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 3670 + "dev": true 3671 + }, 3672 + "nconf": { 3673 + "version": "0.10.0", 3674 + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.10.0.tgz", 3675 + "integrity": "sha512-fKiXMQrpP7CYWJQzKkPPx9hPgmq+YLDyxcG9N8RpiE9FoCkCbzD0NyW0YhE3xn3Aupe7nnDeIx4PFzYehpHT9Q==", 3676 + "requires": { 3677 + "async": "^1.4.0", 3678 + "ini": "^1.3.0", 3679 + "secure-keys": "^1.0.0", 3680 + "yargs": "^3.19.0" 3681 + } 3682 + }, 3683 + "ncp": { 3684 + "version": "0.4.2", 3685 + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", 3686 + "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=" 3687 + }, 3688 + "needle": { 3689 + "version": "2.3.3", 3690 + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.3.tgz", 3691 + "integrity": "sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw==", 3692 + "optional": true, 3693 + "requires": { 3694 + "debug": "^3.2.6", 3695 + "iconv-lite": "^0.4.4", 3696 + "sax": "^1.2.4" 3697 + }, 3698 + "dependencies": { 3699 + "debug": { 3700 + "version": "3.2.6", 3701 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 3702 + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 3703 + "optional": true, 3704 + "requires": { 3705 + "ms": "^2.1.1" 3706 + } 3707 + }, 3708 + "ms": { 3709 + "version": "2.1.2", 3710 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3711 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 3712 + "optional": true 3713 + } 3714 + } 3715 + }, 3716 + "nice-try": { 3717 + "version": "1.0.5", 3718 + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 3719 + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 3720 + "dev": true 3721 + }, 3722 + "node-addon-api": { 3723 + "version": "1.7.1", 3724 + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz", 3725 + "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==" 3726 + }, 3727 + "node-fetch": { 3728 + "version": "2.6.0", 3729 + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 3730 + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 3731 + }, 3732 + "node-gyp-build": { 3733 + "version": "3.7.0", 3734 + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-3.7.0.tgz", 3735 + "integrity": "sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w==" 3736 + }, 3737 + "node-opus": { 3738 + "version": "0.3.3", 3739 + "resolved": "https://registry.npmjs.org/node-opus/-/node-opus-0.3.3.tgz", 3740 + "integrity": "sha512-ZQniA8iJ6y/qOTmW6eyzM9m8odt4CIGV0NM9/U03/pYLhGyxy18QXO25WfrWd8XsUYx57tnxll2xxj54CN08uQ==", 3741 + "requires": { 3742 + "bindings": "~1.2.1", 3743 + "commander": "^2.9.0", 3744 + "nan": "^2.14.0", 3745 + "ogg-packet": "^1.0.0" 3746 + } 3747 + }, 3748 + "node-pre-gyp": { 3749 + "version": "0.14.0", 3750 + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", 3751 + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", 3752 + "optional": true, 3753 + "requires": { 3754 + "detect-libc": "^1.0.2", 3755 + "mkdirp": "^0.5.1", 3756 + "needle": "^2.2.1", 3757 + "nopt": "^4.0.1", 3758 + "npm-packlist": "^1.1.6", 3759 + "npmlog": "^4.0.2", 3760 + "rc": "^1.2.7", 3761 + "rimraf": "^2.6.1", 3762 + "semver": "^5.3.0", 3763 + "tar": "^4.4.2" 3764 + } 3765 + }, 3766 + "nopt": { 3767 + "version": "4.0.3", 3768 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 3769 + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 3770 + "optional": true, 3771 + "requires": { 3772 + "abbrev": "1", 3773 + "osenv": "^0.1.4" 3774 + } 3775 + }, 3776 + "normalize-package-data": { 3777 + "version": "2.5.0", 3778 + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 3779 + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 3780 + "dev": true, 3781 + "requires": { 3782 + "hosted-git-info": "^2.1.4", 3783 + "resolve": "^1.10.0", 3784 + "semver": "2 || 3 || 4 || 5", 3785 + "validate-npm-package-license": "^3.0.1" 3786 + } 3787 + }, 3788 + "normalize-path": { 3789 + "version": "3.0.0", 3790 + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 3791 + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 3792 + }, 3793 + "npm-bundled": { 3794 + "version": "1.1.1", 3795 + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 3796 + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 3797 + "optional": true, 3798 + "requires": { 3799 + "npm-normalize-package-bin": "^1.0.1" 3800 + } 3801 + }, 3802 + "npm-normalize-package-bin": { 3803 + "version": "1.0.1", 3804 + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 3805 + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", 3806 + "optional": true 3807 + }, 3808 + "npm-packlist": { 3809 + "version": "1.4.8", 3810 + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", 3811 + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", 3812 + "optional": true, 3813 + "requires": { 3814 + "ignore-walk": "^3.0.1", 3815 + "npm-bundled": "^1.0.1", 3816 + "npm-normalize-package-bin": "^1.0.1" 3817 + } 3818 + }, 3819 + "npmlog": { 3820 + "version": "4.1.2", 3821 + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 3822 + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 3823 + "optional": true, 3824 + "requires": { 3825 + "are-we-there-yet": "~1.1.2", 3826 + "console-control-strings": "~1.1.0", 3827 + "gauge": "~2.7.3", 3828 + "set-blocking": "~2.0.0" 3829 + } 3830 + }, 3831 + "nssocket": { 3832 + "version": "0.6.0", 3833 + "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", 3834 + "integrity": "sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=", 3835 + "requires": { 3836 + "eventemitter2": "~0.4.14", 3837 + "lazy": "~1.0.11" 3838 + } 3839 + }, 3840 + "number-is-nan": { 3841 + "version": "1.0.1", 3842 + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 3843 + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 3844 + }, 3845 + "object-assign": { 3846 + "version": "4.1.1", 3847 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3848 + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 3849 + }, 3850 + "object-copy": { 3851 + "version": "0.1.0", 3852 + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 3853 + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 3854 + "requires": { 3855 + "copy-descriptor": "^0.1.0", 3856 + "define-property": "^0.2.5", 3857 + "kind-of": "^3.0.3" 3858 + }, 3859 + "dependencies": { 3860 + "define-property": { 3861 + "version": "0.2.5", 3862 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 3863 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 3864 + "requires": { 3865 + "is-descriptor": "^0.1.0" 3866 + } 3867 + }, 3868 + "kind-of": { 3869 + "version": "3.2.2", 3870 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3871 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3872 + "requires": { 3873 + "is-buffer": "^1.1.5" 3874 + } 3875 + } 3876 + } 3877 + }, 3878 + "object-inspect": { 3879 + "version": "1.7.0", 3880 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 3881 + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 3882 + }, 3883 + "object-is": { 3884 + "version": "1.0.2", 3885 + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", 3886 + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" 3887 + }, 3888 + "object-keys": { 3889 + "version": "1.1.1", 3890 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 3891 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 3892 + }, 3893 + "object-visit": { 3894 + "version": "1.0.1", 3895 + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 3896 + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 3897 + "requires": { 3898 + "isobject": "^3.0.0" 3899 + } 3900 + }, 3901 + "object.assign": { 3902 + "version": "4.1.0", 3903 + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 3904 + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 3905 + "requires": { 3906 + "define-properties": "^1.1.2", 3907 + "function-bind": "^1.1.1", 3908 + "has-symbols": "^1.0.0", 3909 + "object-keys": "^1.0.11" 3910 + } 3911 + }, 3912 + "object.entries": { 3913 + "version": "1.1.1", 3914 + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", 3915 + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", 3916 + "dev": true, 3917 + "requires": { 3918 + "define-properties": "^1.1.3", 3919 + "es-abstract": "^1.17.0-next.1", 3920 + "function-bind": "^1.1.1", 3921 + "has": "^1.0.3" 3922 + } 3923 + }, 3924 + "object.fromentries": { 3925 + "version": "2.0.2", 3926 + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", 3927 + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", 3928 + "dev": true, 3929 + "requires": { 3930 + "define-properties": "^1.1.3", 3931 + "es-abstract": "^1.17.0-next.1", 3932 + "function-bind": "^1.1.1", 3933 + "has": "^1.0.3" 3934 + } 3935 + }, 3936 + "object.pick": { 3937 + "version": "1.3.0", 3938 + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 3939 + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 3940 + "requires": { 3941 + "isobject": "^3.0.1" 3942 + } 3943 + }, 3944 + "object.values": { 3945 + "version": "1.1.1", 3946 + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", 3947 + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", 3948 + "dev": true, 3949 + "requires": { 3950 + "define-properties": "^1.1.3", 3951 + "es-abstract": "^1.17.0-next.1", 3952 + "function-bind": "^1.1.1", 3953 + "has": "^1.0.3" 3954 + } 3955 + }, 3956 + "ogg-packet": { 3957 + "version": "1.0.1", 3958 + "resolved": "https://registry.npmjs.org/ogg-packet/-/ogg-packet-1.0.1.tgz", 3959 + "integrity": "sha512-dW1ok3BMnMikyXGDIgVEckWnlViW8JLWQV4qj9aN/rNRVqHlDYSlcIEtSIMH7tpuUOiIxAhY3+OxNdIOm6s17A==", 3960 + "optional": true, 3961 + "requires": { 3962 + "ref-struct": "*" 3963 + } 3964 + }, 3965 + "once": { 3966 + "version": "1.4.0", 3967 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 3968 + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 3969 + "requires": { 3970 + "wrappy": "1" 3971 + } 3972 + }, 3973 + "onetime": { 3974 + "version": "5.1.0", 3975 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 3976 + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 3977 + "dev": true, 3978 + "requires": { 3979 + "mimic-fn": "^2.1.0" 3980 + } 3981 + }, 3982 + "optimist": { 3983 + "version": "0.6.1", 3984 + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 3985 + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 3986 + "requires": { 3987 + "minimist": "~0.0.1", 3988 + "wordwrap": "~0.0.2" 3989 + } 3990 + }, 3991 + "optionator": { 3992 + "version": "0.8.3", 3993 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 3994 + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 3995 + "dev": true, 3996 + "requires": { 3997 + "deep-is": "~0.1.3", 3998 + "fast-levenshtein": "~2.0.6", 3999 + "levn": "~0.3.0", 4000 + "prelude-ls": "~1.1.2", 4001 + "type-check": "~0.3.2", 4002 + "word-wrap": "~1.2.3" 4003 + } 4004 + }, 4005 + "opusscript": { 4006 + "version": "0.0.7", 4007 + "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.7.tgz", 4008 + "integrity": "sha512-DcBadTdYTUuH9zQtepsLjQn4Ll6rs3dmeFvN+SD0ThPnxRBRm/WC1zXWPg+wgAJimB784gdZvUMA57gDP7FdVg==" 4009 + }, 4010 + "os-homedir": { 4011 + "version": "1.0.2", 4012 + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 4013 + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 4014 + "optional": true 4015 + }, 4016 + "os-locale": { 4017 + "version": "1.4.0", 4018 + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 4019 + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 4020 + "requires": { 4021 + "lcid": "^1.0.0" 4022 + } 4023 + }, 4024 + "os-tmpdir": { 4025 + "version": "1.0.2", 4026 + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 4027 + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 4028 + }, 4029 + "osenv": { 4030 + "version": "0.1.5", 4031 + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 4032 + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 4033 + "optional": true, 4034 + "requires": { 4035 + "os-homedir": "^1.0.0", 4036 + "os-tmpdir": "^1.0.0" 4037 + } 4038 + }, 4039 + "p-limit": { 4040 + "version": "1.3.0", 4041 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 4042 + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 4043 + "dev": true, 4044 + "requires": { 4045 + "p-try": "^1.0.0" 4046 + } 4047 + }, 4048 + "p-locate": { 4049 + "version": "2.0.0", 4050 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 4051 + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 4052 + "dev": true, 4053 + "requires": { 4054 + "p-limit": "^1.1.0" 4055 + } 4056 + }, 4057 + "p-try": { 4058 + "version": "1.0.0", 4059 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 4060 + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 4061 + "dev": true 4062 + }, 4063 + "parent-module": { 4064 + "version": "1.0.1", 4065 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 4066 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 4067 + "dev": true, 4068 + "requires": { 4069 + "callsites": "^3.0.0" 4070 + } 4071 + }, 4072 + "parse-json": { 4073 + "version": "2.2.0", 4074 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 4075 + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 4076 + "dev": true, 4077 + "requires": { 4078 + "error-ex": "^1.2.0" 4079 + } 4080 + }, 4081 + "pascalcase": { 4082 + "version": "0.1.1", 4083 + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 4084 + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" 4085 + }, 4086 + "path-dirname": { 4087 + "version": "1.0.2", 4088 + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 4089 + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 4090 + }, 4091 + "path-exists": { 4092 + "version": "3.0.0", 4093 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 4094 + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 4095 + "dev": true 4096 + }, 4097 + "path-is-absolute": { 4098 + "version": "1.0.1", 4099 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 4100 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 4101 + }, 4102 + "path-key": { 4103 + "version": "2.0.1", 4104 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 4105 + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 4106 + "dev": true 4107 + }, 4108 + "path-parse": { 4109 + "version": "1.0.6", 4110 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 4111 + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 4112 + "dev": true 4113 + }, 4114 + "path-type": { 4115 + "version": "2.0.0", 4116 + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", 4117 + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", 4118 + "dev": true, 4119 + "requires": { 4120 + "pify": "^2.0.0" 4121 + } 4122 + }, 4123 + "pify": { 4124 + "version": "2.3.0", 4125 + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 4126 + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 4127 + "dev": true 4128 + }, 4129 + "pkg-dir": { 4130 + "version": "2.0.0", 4131 + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 4132 + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 4133 + "dev": true, 4134 + "requires": { 4135 + "find-up": "^2.1.0" 4136 + } 4137 + }, 4138 + "pkginfo": { 4139 + "version": "0.3.1", 4140 + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 4141 + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" 4142 + }, 4143 + "posix-character-classes": { 4144 + "version": "0.1.1", 4145 + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 4146 + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" 4147 + }, 4148 + "prelude-ls": { 4149 + "version": "1.1.2", 4150 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 4151 + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 4152 + "dev": true 4153 + }, 4154 + "prettier": { 4155 + "version": "1.19.1", 4156 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", 4157 + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", 4158 + "dev": true 4159 + }, 4160 + "prettier-linter-helpers": { 4161 + "version": "1.0.0", 4162 + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", 4163 + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", 4164 + "dev": true, 4165 + "requires": { 4166 + "fast-diff": "^1.1.2" 4167 + } 4168 + }, 4169 + "prettyjson": { 4170 + "version": "1.2.1", 4171 + "resolved": "https://registry.npmjs.org/prettyjson/-/prettyjson-1.2.1.tgz", 4172 + "integrity": "sha1-/P+rQdGcq0365eV15kJGYZsS0ok=", 4173 + "requires": { 4174 + "colors": "^1.1.2", 4175 + "minimist": "^1.2.0" 4176 + }, 4177 + "dependencies": { 4178 + "colors": { 4179 + "version": "1.4.0", 4180 + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 4181 + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 4182 + }, 4183 + "minimist": { 4184 + "version": "1.2.5", 4185 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 4186 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 4187 + } 4188 + } 4189 + }, 4190 + "prism-media": { 4191 + "version": "1.2.1", 4192 + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.1.tgz", 4193 + "integrity": "sha512-R3EbKwJiYlTvGwcG1DpUt+06DsxOGS5W4AMEHT7oVOjG93MjpdhGX1whHyjnqknylLMupKAsKMEXcTNRbPe6Vw==" 4194 + }, 4195 + "process-nextick-args": { 4196 + "version": "2.0.0", 4197 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 4198 + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 4199 + }, 4200 + "progress": { 4201 + "version": "2.0.3", 4202 + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 4203 + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 4204 + "dev": true 4205 + }, 4206 + "prompt": { 4207 + "version": "0.2.14", 4208 + "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", 4209 + "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", 4210 + "requires": { 4211 + "pkginfo": "0.x.x", 4212 + "read": "1.0.x", 4213 + "revalidator": "0.1.x", 4214 + "utile": "0.2.x", 4215 + "winston": "0.8.x" 4216 + }, 4217 + "dependencies": { 4218 + "async": { 4219 + "version": "0.2.10", 4220 + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 4221 + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" 4222 + }, 4223 + "utile": { 4224 + "version": "0.2.1", 4225 + "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", 4226 + "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", 4227 + "requires": { 4228 + "async": "~0.2.9", 4229 + "deep-equal": "*", 4230 + "i": "0.3.x", 4231 + "mkdirp": "0.x.x", 4232 + "ncp": "0.4.x", 4233 + "rimraf": "2.x.x" 4234 + } 4235 + } 4236 + } 4237 + }, 4238 + "prop-types": { 4239 + "version": "15.7.2", 4240 + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", 4241 + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", 4242 + "dev": true, 4243 + "requires": { 4244 + "loose-envify": "^1.4.0", 4245 + "object-assign": "^4.1.1", 4246 + "react-is": "^16.8.1" 4247 + }, 4248 + "dependencies": { 4249 + "object-assign": { 4250 + "version": "4.1.1", 4251 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 4252 + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 4253 + "dev": true 4254 + } 4255 + } 4256 + }, 4257 + "ps-tree": { 4258 + "version": "0.0.3", 4259 + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-0.0.3.tgz", 4260 + "integrity": "sha1-2/jXUqf+Ivp9WGNWiUmWEOknbdw=", 4261 + "requires": { 4262 + "event-stream": "~0.5" 4263 + } 4264 + }, 4265 + "punycode": { 4266 + "version": "2.1.1", 4267 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 4268 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 4269 + "dev": true 4270 + }, 4271 + "rc": { 4272 + "version": "1.2.8", 4273 + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 4274 + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 4275 + "optional": true, 4276 + "requires": { 4277 + "deep-extend": "^0.6.0", 4278 + "ini": "~1.3.0", 4279 + "minimist": "^1.2.0", 4280 + "strip-json-comments": "~2.0.1" 4281 + }, 4282 + "dependencies": { 4283 + "minimist": { 4284 + "version": "1.2.5", 4285 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 4286 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 4287 + "optional": true 4288 + }, 4289 + "strip-json-comments": { 4290 + "version": "2.0.1", 4291 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 4292 + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 4293 + "optional": true 4294 + } 4295 + } 4296 + }, 4297 + "react-is": { 4298 + "version": "16.13.0", 4299 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", 4300 + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", 4301 + "dev": true 4302 + }, 4303 + "read": { 4304 + "version": "1.0.7", 4305 + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 4306 + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 4307 + "requires": { 4308 + "mute-stream": "~0.0.4" 4309 + } 4310 + }, 4311 + "read-pkg": { 4312 + "version": "2.0.0", 4313 + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", 4314 + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", 4315 + "dev": true, 4316 + "requires": { 4317 + "load-json-file": "^2.0.0", 4318 + "normalize-package-data": "^2.3.2", 4319 + "path-type": "^2.0.0" 4320 + } 4321 + }, 4322 + "read-pkg-up": { 4323 + "version": "2.0.0", 4324 + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", 4325 + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", 4326 + "dev": true, 4327 + "requires": { 4328 + "find-up": "^2.0.0", 4329 + "read-pkg": "^2.0.0" 4330 + } 4331 + }, 4332 + "readable-stream": { 4333 + "version": "2.3.6", 4334 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 4335 + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 4336 + "requires": { 4337 + "core-util-is": "~1.0.0", 4338 + "inherits": "~2.0.3", 4339 + "isarray": "~1.0.0", 4340 + "process-nextick-args": "~2.0.0", 4341 + "safe-buffer": "~5.1.1", 4342 + "string_decoder": "~1.1.1", 4343 + "util-deprecate": "~1.0.1" 4344 + } 4345 + }, 4346 + "readdirp": { 4347 + "version": "2.2.1", 4348 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", 4349 + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", 4350 + "requires": { 4351 + "graceful-fs": "^4.1.11", 4352 + "micromatch": "^3.1.10", 4353 + "readable-stream": "^2.0.2" 4354 + } 4355 + }, 4356 + "ref": { 4357 + "version": "1.3.5", 4358 + "resolved": "https://registry.npmjs.org/ref/-/ref-1.3.5.tgz", 4359 + "integrity": "sha512-2cBCniTtxcGUjDpvFfVpw323a83/0RLSGJJY5l5lcomZWhYpU2cuLdsvYqMixvsdLJ9+sTdzEkju8J8ZHDM2nA==", 4360 + "optional": true, 4361 + "requires": { 4362 + "bindings": "1", 4363 + "debug": "2", 4364 + "nan": "2" 4365 + }, 4366 + "dependencies": { 4367 + "debug": { 4368 + "version": "2.6.9", 4369 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4370 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 4371 + "optional": true, 4372 + "requires": { 4373 + "ms": "2.0.0" 4374 + } 4375 + } 4376 + } 4377 + }, 4378 + "ref-struct": { 4379 + "version": "1.1.0", 4380 + "resolved": "https://registry.npmjs.org/ref-struct/-/ref-struct-1.1.0.tgz", 4381 + "integrity": "sha1-XV7mWtQc78Olxf60BYcmHkee3BM=", 4382 + "optional": true, 4383 + "requires": { 4384 + "debug": "2", 4385 + "ref": "1" 4386 + }, 4387 + "dependencies": { 4388 + "debug": { 4389 + "version": "2.6.9", 4390 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4391 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 4392 + "optional": true, 4393 + "requires": { 4394 + "ms": "2.0.0" 4395 + } 4396 + } 4397 + } 4398 + }, 4399 + "regenerator-runtime": { 4400 + "version": "0.13.3", 4401 + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", 4402 + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", 4403 + "dev": true 4404 + }, 4405 + "regex-not": { 4406 + "version": "1.0.2", 4407 + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 4408 + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 4409 + "requires": { 4410 + "extend-shallow": "^3.0.2", 4411 + "safe-regex": "^1.1.0" 4412 + } 4413 + }, 4414 + "regexp.prototype.flags": { 4415 + "version": "1.3.0", 4416 + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", 4417 + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", 4418 + "requires": { 4419 + "define-properties": "^1.1.3", 4420 + "es-abstract": "^1.17.0-next.1" 4421 + } 4422 + }, 4423 + "regexpp": { 4424 + "version": "3.0.0", 4425 + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", 4426 + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", 4427 + "dev": true 4428 + }, 4429 + "remove-trailing-separator": { 4430 + "version": "1.1.0", 4431 + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 4432 + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 4433 + }, 4434 + "repeat-element": { 4435 + "version": "1.1.3", 4436 + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", 4437 + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" 4438 + }, 4439 + "repeat-string": { 4440 + "version": "1.6.1", 4441 + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 4442 + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 4443 + }, 4444 + "require_optional": { 4445 + "version": "1.0.1", 4446 + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 4447 + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 4448 + "requires": { 4449 + "resolve-from": "^2.0.0", 4450 + "semver": "^5.1.0" 4451 + }, 4452 + "dependencies": { 4453 + "resolve-from": { 4454 + "version": "2.0.0", 4455 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 4456 + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 4457 + } 4458 + } 4459 + }, 4460 + "resolve": { 4461 + "version": "1.13.1", 4462 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", 4463 + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", 4464 + "dev": true, 4465 + "requires": { 4466 + "path-parse": "^1.0.6" 4467 + } 4468 + }, 4469 + "resolve-from": { 4470 + "version": "4.0.0", 4471 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 4472 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 4473 + "dev": true 4474 + }, 4475 + "resolve-url": { 4476 + "version": "0.2.1", 4477 + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 4478 + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 4479 + }, 4480 + "restore-cursor": { 4481 + "version": "3.1.0", 4482 + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 4483 + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 4484 + "dev": true, 4485 + "requires": { 4486 + "onetime": "^5.1.0", 4487 + "signal-exit": "^3.0.2" 4488 + } 4489 + }, 4490 + "resumer": { 4491 + "version": "0.0.0", 4492 + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 4493 + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 4494 + "requires": { 4495 + "through": "~2.3.4" 4496 + } 4497 + }, 4498 + "ret": { 4499 + "version": "0.1.15", 4500 + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 4501 + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 4502 + }, 4503 + "revalidator": { 4504 + "version": "0.1.8", 4505 + "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", 4506 + "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" 4507 + }, 4508 + "rimraf": { 4509 + "version": "2.6.3", 4510 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 4511 + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 4512 + "requires": { 4513 + "glob": "^7.1.3" 4514 + }, 4515 + "dependencies": { 4516 + "glob": { 4517 + "version": "7.1.4", 4518 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 4519 + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 4520 + "requires": { 4521 + "fs.realpath": "^1.0.0", 4522 + "inflight": "^1.0.4", 4523 + "inherits": "2", 4524 + "minimatch": "^3.0.4", 4525 + "once": "^1.3.0", 4526 + "path-is-absolute": "^1.0.0" 4527 + } 4528 + } 4529 + } 4530 + }, 4531 + "run-async": { 4532 + "version": "2.4.0", 4533 + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", 4534 + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", 4535 + "dev": true, 4536 + "requires": { 4537 + "is-promise": "^2.1.0" 4538 + } 4539 + }, 4540 + "rxjs": { 4541 + "version": "6.5.4", 4542 + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", 4543 + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", 4544 + "dev": true, 4545 + "requires": { 4546 + "tslib": "^1.9.0" 4547 + } 4548 + }, 4549 + "safe-buffer": { 4550 + "version": "5.1.1", 4551 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 4552 + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 4553 + }, 4554 + "safe-regex": { 4555 + "version": "1.1.0", 4556 + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 4557 + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 4558 + "requires": { 4559 + "ret": "~0.1.10" 4560 + } 4561 + }, 4562 + "safer-buffer": { 4563 + "version": "2.1.2", 4564 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 4565 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 4566 + }, 4567 + "saslprep": { 4568 + "version": "1.0.3", 4569 + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 4570 + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 4571 + "optional": true, 4572 + "requires": { 4573 + "sparse-bitfield": "^3.0.3" 4574 + } 4575 + }, 4576 + "sax": { 4577 + "version": "1.2.4", 4578 + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 4579 + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", 4580 + "optional": true 4581 + }, 4582 + "secure-keys": { 4583 + "version": "1.0.0", 4584 + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", 4585 + "integrity": "sha1-8MgtmKOxOah3aogIBQuCRDEIf8o=" 4586 + }, 4587 + "semver": { 4588 + "version": "5.6.0", 4589 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 4590 + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 4591 + }, 4592 + "set-blocking": { 4593 + "version": "2.0.0", 4594 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 4595 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 4596 + "optional": true 4597 + }, 4598 + "set-value": { 4599 + "version": "2.0.1", 4600 + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 4601 + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", 4602 + "requires": { 4603 + "extend-shallow": "^2.0.1", 4604 + "is-extendable": "^0.1.1", 4605 + "is-plain-object": "^2.0.3", 4606 + "split-string": "^3.0.1" 4607 + }, 4608 + "dependencies": { 4609 + "extend-shallow": { 4610 + "version": "2.0.1", 4611 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 4612 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 4613 + "requires": { 4614 + "is-extendable": "^0.1.0" 4615 + } 4616 + } 4617 + } 4618 + }, 4619 + "setimmediate": { 4620 + "version": "1.0.5", 4621 + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 4622 + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 4623 + }, 4624 + "shebang-command": { 4625 + "version": "1.2.0", 4626 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 4627 + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 4628 + "dev": true, 4629 + "requires": { 4630 + "shebang-regex": "^1.0.0" 4631 + } 4632 + }, 4633 + "shebang-regex": { 4634 + "version": "1.0.0", 4635 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 4636 + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 4637 + "dev": true 4638 + }, 4639 + "shush": { 4640 + "version": "1.0.0", 4641 + "resolved": "https://registry.npmjs.org/shush/-/shush-1.0.0.tgz", 4642 + "integrity": "sha1-wnQVqeRY8v7TmyfPjrN8ADeCtDE=", 4643 + "requires": { 4644 + "caller": "~0.0.1", 4645 + "strip-json-comments": "~0.1.1" 4646 + }, 4647 + "dependencies": { 4648 + "strip-json-comments": { 4649 + "version": "0.1.3", 4650 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz", 4651 + "integrity": "sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ=" 4652 + } 4653 + } 4654 + }, 4655 + "side-channel": { 4656 + "version": "1.0.2", 4657 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", 4658 + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", 4659 + "requires": { 4660 + "es-abstract": "^1.17.0-next.1", 4661 + "object-inspect": "^1.7.0" 4662 + } 4663 + }, 4664 + "signal-exit": { 4665 + "version": "3.0.2", 4666 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 4667 + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 4668 + }, 4669 + "slice-ansi": { 4670 + "version": "2.1.0", 4671 + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 4672 + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 4673 + "dev": true, 4674 + "requires": { 4675 + "ansi-styles": "^3.2.0", 4676 + "astral-regex": "^1.0.0", 4677 + "is-fullwidth-code-point": "^2.0.0" 4678 + }, 4679 + "dependencies": { 4680 + "is-fullwidth-code-point": { 4681 + "version": "2.0.0", 4682 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 4683 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 4684 + "dev": true 4685 + } 4686 + } 4687 + }, 4688 + "snapdragon": { 4689 + "version": "0.8.2", 4690 + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 4691 + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 4692 + "requires": { 4693 + "base": "^0.11.1", 4694 + "debug": "^2.2.0", 4695 + "define-property": "^0.2.5", 4696 + "extend-shallow": "^2.0.1", 4697 + "map-cache": "^0.2.2", 4698 + "source-map": "^0.5.6", 4699 + "source-map-resolve": "^0.5.0", 4700 + "use": "^3.1.0" 4701 + }, 4702 + "dependencies": { 4703 + "debug": { 4704 + "version": "2.6.9", 4705 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 4706 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 4707 + "requires": { 4708 + "ms": "2.0.0" 4709 + } 4710 + }, 4711 + "define-property": { 4712 + "version": "0.2.5", 4713 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 4714 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 4715 + "requires": { 4716 + "is-descriptor": "^0.1.0" 4717 + } 4718 + }, 4719 + "extend-shallow": { 4720 + "version": "2.0.1", 4721 + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 4722 + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 4723 + "requires": { 4724 + "is-extendable": "^0.1.0" 4725 + } 4726 + } 4727 + } 4728 + }, 4729 + "snapdragon-node": { 4730 + "version": "2.1.1", 4731 + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 4732 + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 4733 + "requires": { 4734 + "define-property": "^1.0.0", 4735 + "isobject": "^3.0.0", 4736 + "snapdragon-util": "^3.0.1" 4737 + }, 4738 + "dependencies": { 4739 + "define-property": { 4740 + "version": "1.0.0", 4741 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 4742 + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 4743 + "requires": { 4744 + "is-descriptor": "^1.0.0" 4745 + } 4746 + }, 4747 + "is-accessor-descriptor": { 4748 + "version": "1.0.0", 4749 + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 4750 + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 4751 + "requires": { 4752 + "kind-of": "^6.0.0" 4753 + } 4754 + }, 4755 + "is-data-descriptor": { 4756 + "version": "1.0.0", 4757 + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 4758 + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 4759 + "requires": { 4760 + "kind-of": "^6.0.0" 4761 + } 4762 + }, 4763 + "is-descriptor": { 4764 + "version": "1.0.2", 4765 + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 4766 + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 4767 + "requires": { 4768 + "is-accessor-descriptor": "^1.0.0", 4769 + "is-data-descriptor": "^1.0.0", 4770 + "kind-of": "^6.0.2" 4771 + } 4772 + } 4773 + } 4774 + }, 4775 + "snapdragon-util": { 4776 + "version": "3.0.1", 4777 + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 4778 + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 4779 + "requires": { 4780 + "kind-of": "^3.2.0" 4781 + }, 4782 + "dependencies": { 4783 + "kind-of": { 4784 + "version": "3.2.2", 4785 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 4786 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 4787 + "requires": { 4788 + "is-buffer": "^1.1.5" 4789 + } 4790 + } 4791 + } 4792 + }, 4793 + "source-map": { 4794 + "version": "0.5.7", 4795 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 4796 + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 4797 + }, 4798 + "source-map-resolve": { 4799 + "version": "0.5.3", 4800 + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", 4801 + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", 4802 + "requires": { 4803 + "atob": "^2.1.2", 4804 + "decode-uri-component": "^0.2.0", 4805 + "resolve-url": "^0.2.1", 4806 + "source-map-url": "^0.4.0", 4807 + "urix": "^0.1.0" 4808 + } 4809 + }, 4810 + "source-map-url": { 4811 + "version": "0.4.0", 4812 + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 4813 + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" 4814 + }, 4815 + "sparse-bitfield": { 4816 + "version": "3.0.3", 4817 + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 4818 + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 4819 + "optional": true, 4820 + "requires": { 4821 + "memory-pager": "^1.0.2" 4822 + } 4823 + }, 4824 + "spdx-correct": { 4825 + "version": "3.1.0", 4826 + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 4827 + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 4828 + "dev": true, 4829 + "requires": { 4830 + "spdx-expression-parse": "^3.0.0", 4831 + "spdx-license-ids": "^3.0.0" 4832 + } 4833 + }, 4834 + "spdx-exceptions": { 4835 + "version": "2.2.0", 4836 + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 4837 + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", 4838 + "dev": true 4839 + }, 4840 + "spdx-expression-parse": { 4841 + "version": "3.0.0", 4842 + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 4843 + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 4844 + "dev": true, 4845 + "requires": { 4846 + "spdx-exceptions": "^2.1.0", 4847 + "spdx-license-ids": "^3.0.0" 4848 + } 4849 + }, 4850 + "spdx-license-ids": { 4851 + "version": "3.0.5", 4852 + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 4853 + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", 4854 + "dev": true 4855 + }, 4856 + "split-string": { 4857 + "version": "3.1.0", 4858 + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 4859 + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 4860 + "requires": { 4861 + "extend-shallow": "^3.0.0" 4862 + } 4863 + }, 4864 + "sprintf-js": { 4865 + "version": "1.0.3", 4866 + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 4867 + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 4868 + "dev": true 4869 + }, 4870 + "stack-trace": { 4871 + "version": "0.0.10", 4872 + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 4873 + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 4874 + }, 4875 + "static-extend": { 4876 + "version": "0.1.2", 4877 + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 4878 + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 4879 + "requires": { 4880 + "define-property": "^0.2.5", 4881 + "object-copy": "^0.1.0" 4882 + }, 4883 + "dependencies": { 4884 + "define-property": { 4885 + "version": "0.2.5", 4886 + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 4887 + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 4888 + "requires": { 4889 + "is-descriptor": "^0.1.0" 4890 + } 4891 + } 4892 + } 4893 + }, 4894 + "string-width": { 4895 + "version": "4.2.0", 4896 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 4897 + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 4898 + "dev": true, 4899 + "requires": { 4900 + "emoji-regex": "^8.0.0", 4901 + "is-fullwidth-code-point": "^3.0.0", 4902 + "strip-ansi": "^6.0.0" 4903 + }, 4904 + "dependencies": { 4905 + "strip-ansi": { 4906 + "version": "6.0.0", 4907 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 4908 + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 4909 + "dev": true, 4910 + "requires": { 4911 + "ansi-regex": "^5.0.0" 4912 + } 4913 + } 4914 + } 4915 + }, 4916 + "string.prototype.matchall": { 4917 + "version": "4.0.2", 4918 + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", 4919 + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", 4920 + "dev": true, 4921 + "requires": { 4922 + "define-properties": "^1.1.3", 4923 + "es-abstract": "^1.17.0", 4924 + "has-symbols": "^1.0.1", 4925 + "internal-slot": "^1.0.2", 4926 + "regexp.prototype.flags": "^1.3.0", 4927 + "side-channel": "^1.0.2" 4928 + }, 4929 + "dependencies": { 4930 + "es-abstract": { 4931 + "version": "1.17.4", 4932 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", 4933 + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", 4934 + "dev": true, 4935 + "requires": { 4936 + "es-to-primitive": "^1.2.1", 4937 + "function-bind": "^1.1.1", 4938 + "has": "^1.0.3", 4939 + "has-symbols": "^1.0.1", 4940 + "is-callable": "^1.1.5", 4941 + "is-regex": "^1.0.5", 4942 + "object-inspect": "^1.7.0", 4943 + "object-keys": "^1.1.1", 4944 + "object.assign": "^4.1.0", 4945 + "string.prototype.trimleft": "^2.1.1", 4946 + "string.prototype.trimright": "^2.1.1" 4947 + } 4948 + }, 4949 + "is-callable": { 4950 + "version": "1.1.5", 4951 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 4952 + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 4953 + "dev": true 4954 + }, 4955 + "is-regex": { 4956 + "version": "1.0.5", 4957 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 4958 + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 4959 + "dev": true, 4960 + "requires": { 4961 + "has": "^1.0.3" 4962 + } 4963 + }, 4964 + "string.prototype.trimleft": { 4965 + "version": "2.1.1", 4966 + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 4967 + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", 4968 + "dev": true, 4969 + "requires": { 4970 + "define-properties": "^1.1.3", 4971 + "function-bind": "^1.1.1" 4972 + } 4973 + }, 4974 + "string.prototype.trimright": { 4975 + "version": "2.1.1", 4976 + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 4977 + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", 4978 + "dev": true, 4979 + "requires": { 4980 + "define-properties": "^1.1.3", 4981 + "function-bind": "^1.1.1" 4982 + } 4983 + } 4984 + } 4985 + }, 4986 + "string.prototype.trimleft": { 4987 + "version": "2.1.0", 4988 + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 4989 + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 4990 + "requires": { 4991 + "define-properties": "^1.1.3", 4992 + "function-bind": "^1.1.1" 4993 + } 4994 + }, 4995 + "string.prototype.trimright": { 4996 + "version": "2.1.0", 4997 + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 4998 + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 4999 + "requires": { 5000 + "define-properties": "^1.1.3", 5001 + "function-bind": "^1.1.1" 5002 + } 5003 + }, 5004 + "string_decoder": { 5005 + "version": "1.1.1", 5006 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 5007 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 5008 + "requires": { 5009 + "safe-buffer": "~5.1.0" 5010 + } 5011 + }, 5012 + "strip-ansi": { 5013 + "version": "5.2.0", 5014 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 5015 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 5016 + "dev": true, 5017 + "requires": { 5018 + "ansi-regex": "^4.1.0" 5019 + }, 5020 + "dependencies": { 5021 + "ansi-regex": { 5022 + "version": "4.1.0", 5023 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 5024 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 5025 + "dev": true 5026 + } 5027 + } 5028 + }, 5029 + "strip-bom": { 5030 + "version": "3.0.0", 5031 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 5032 + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 5033 + "dev": true 5034 + }, 5035 + "strip-json-comments": { 5036 + "version": "3.0.1", 5037 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 5038 + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 5039 + "dev": true 5040 + }, 5041 + "supports-color": { 5042 + "version": "5.5.0", 5043 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 5044 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 5045 + "dev": true, 5046 + "requires": { 5047 + "has-flag": "^3.0.0" 5048 + } 5049 + }, 5050 + "systeminformation": { 5051 + "version": "4.23.1", 5052 + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.23.1.tgz", 5053 + "integrity": "sha512-gtqfvz5jUIMqWn0kkdkV4G8uiLmJckQ+z6aKy1uyE0OPU/6tStubahtZDiF0ajSRVJht+Vd4pX5DDwQLhAapww==" 5054 + }, 5055 + "table": { 5056 + "version": "5.4.6", 5057 + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 5058 + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 5059 + "dev": true, 5060 + "requires": { 5061 + "ajv": "^6.10.2", 5062 + "lodash": "^4.17.14", 5063 + "slice-ansi": "^2.1.0", 5064 + "string-width": "^3.0.0" 5065 + }, 5066 + "dependencies": { 5067 + "emoji-regex": { 5068 + "version": "7.0.3", 5069 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 5070 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 5071 + "dev": true 5072 + }, 5073 + "is-fullwidth-code-point": { 5074 + "version": "2.0.0", 5075 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 5076 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 5077 + "dev": true 5078 + }, 5079 + "string-width": { 5080 + "version": "3.1.0", 5081 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 5082 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 5083 + "dev": true, 5084 + "requires": { 5085 + "emoji-regex": "^7.0.1", 5086 + "is-fullwidth-code-point": "^2.0.0", 5087 + "strip-ansi": "^5.1.0" 5088 + } 5089 + } 5090 + } 5091 + }, 5092 + "tape": { 5093 + "version": "2.3.3", 5094 + "resolved": "https://registry.npmjs.org/tape/-/tape-2.3.3.tgz", 5095 + "integrity": "sha1-Lnzgox3wn41oUWZKcYQuDKUFevc=", 5096 + "requires": { 5097 + "deep-equal": "~0.1.0", 5098 + "defined": "~0.0.0", 5099 + "inherits": "~2.0.1", 5100 + "jsonify": "~0.0.0", 5101 + "resumer": "~0.0.0", 5102 + "through": "~2.3.4" 5103 + }, 5104 + "dependencies": { 5105 + "deep-equal": { 5106 + "version": "0.1.2", 5107 + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.1.2.tgz", 5108 + "integrity": "sha1-skbCuApXCkfBG+HZvRBw7IeLh84=" 5109 + } 5110 + } 5111 + }, 5112 + "tar": { 5113 + "version": "4.4.13", 5114 + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 5115 + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 5116 + "optional": true, 5117 + "requires": { 5118 + "chownr": "^1.1.1", 5119 + "fs-minipass": "^1.2.5", 5120 + "minipass": "^2.8.6", 5121 + "minizlib": "^1.2.1", 5122 + "mkdirp": "^0.5.0", 5123 + "safe-buffer": "^5.1.2", 5124 + "yallist": "^3.0.3" 5125 + }, 5126 + "dependencies": { 5127 + "safe-buffer": { 5128 + "version": "5.2.0", 5129 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 5130 + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 5131 + "optional": true 5132 + } 5133 + } 5134 + }, 5135 + "text-table": { 5136 + "version": "0.2.0", 5137 + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 5138 + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 5139 + "dev": true 5140 + }, 5141 + "through": { 5142 + "version": "2.3.8", 5143 + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", 5144 + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 5145 + }, 5146 + "tiny-glob": { 5147 + "version": "0.2.6", 5148 + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.6.tgz", 5149 + "integrity": "sha512-A7ewMqPu1B5PWwC3m7KVgAu96Ch5LA0w4SnEN/LbDREj/gAD0nPWboRbn8YoP9ISZXqeNAlMvKSKoEuhcfK3Pw==", 5150 + "dev": true, 5151 + "requires": { 5152 + "globalyzer": "^0.1.0", 5153 + "globrex": "^0.1.1" 5154 + } 5155 + }, 5156 + "tmp": { 5157 + "version": "0.0.33", 5158 + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 5159 + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 5160 + "dev": true, 5161 + "requires": { 5162 + "os-tmpdir": "~1.0.2" 5163 + } 5164 + }, 5165 + "to-object-path": { 5166 + "version": "0.3.0", 5167 + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 5168 + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 5169 + "requires": { 5170 + "kind-of": "^3.0.2" 5171 + }, 5172 + "dependencies": { 5173 + "kind-of": { 5174 + "version": "3.2.2", 5175 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 5176 + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 5177 + "requires": { 5178 + "is-buffer": "^1.1.5" 5179 + } 5180 + } 5181 + } 5182 + }, 5183 + "to-regex": { 5184 + "version": "3.0.2", 5185 + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 5186 + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 5187 + "requires": { 5188 + "define-property": "^2.0.2", 5189 + "extend-shallow": "^3.0.2", 5190 + "regex-not": "^1.0.2", 5191 + "safe-regex": "^1.1.0" 5192 + } 5193 + }, 5194 + "to-regex-range": { 5195 + "version": "2.1.1", 5196 + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 5197 + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 5198 + "requires": { 5199 + "is-number": "^3.0.0", 5200 + "repeat-string": "^1.6.1" 5201 + } 5202 + }, 5203 + "tsconfig-paths": { 5204 + "version": "3.9.0", 5205 + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", 5206 + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", 5207 + "dev": true, 5208 + "requires": { 5209 + "@types/json5": "^0.0.29", 5210 + "json5": "^1.0.1", 5211 + "minimist": "^1.2.0", 5212 + "strip-bom": "^3.0.0" 5213 + }, 5214 + "dependencies": { 5215 + "minimist": { 5216 + "version": "1.2.5", 5217 + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 5218 + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 5219 + "dev": true 5220 + } 5221 + } 5222 + }, 5223 + "tslib": { 5224 + "version": "1.11.1", 5225 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", 5226 + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", 5227 + "dev": true 5228 + }, 5229 + "tsutils": { 5230 + "version": "3.17.1", 5231 + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", 5232 + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", 5233 + "dev": true, 5234 + "requires": { 5235 + "tslib": "^1.8.1" 5236 + } 5237 + }, 5238 + "tweetnacl": { 5239 + "version": "1.0.3", 5240 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 5241 + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 5242 + }, 5243 + "type-check": { 5244 + "version": "0.3.2", 5245 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 5246 + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 5247 + "dev": true, 5248 + "requires": { 5249 + "prelude-ls": "~1.1.2" 5250 + } 5251 + }, 5252 + "type-fest": { 5253 + "version": "0.8.1", 5254 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 5255 + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 5256 + "dev": true 5257 + }, 5258 + "typescript": { 5259 + "version": "3.8.3", 5260 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", 5261 + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", 5262 + "dev": true 5263 + }, 5264 + "union-value": { 5265 + "version": "1.0.1", 5266 + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", 5267 + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", 5268 + "requires": { 5269 + "arr-union": "^3.1.0", 5270 + "get-value": "^2.0.6", 5271 + "is-extendable": "^0.1.1", 5272 + "set-value": "^2.0.1" 5273 + } 5274 + }, 5275 + "unset-value": { 5276 + "version": "1.0.0", 5277 + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 5278 + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 5279 + "requires": { 5280 + "has-value": "^0.3.1", 5281 + "isobject": "^3.0.0" 5282 + }, 5283 + "dependencies": { 5284 + "has-value": { 5285 + "version": "0.3.1", 5286 + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 5287 + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 5288 + "requires": { 5289 + "get-value": "^2.0.3", 5290 + "has-values": "^0.1.4", 5291 + "isobject": "^2.0.0" 5292 + }, 5293 + "dependencies": { 5294 + "isobject": { 5295 + "version": "2.1.0", 5296 + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 5297 + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 5298 + "requires": { 5299 + "isarray": "1.0.0" 5300 + } 5301 + } 5302 + } 5303 + }, 5304 + "has-values": { 5305 + "version": "0.1.4", 5306 + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 5307 + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" 5308 + } 5309 + } 5310 + }, 5311 + "upath": { 5312 + "version": "1.2.0", 5313 + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", 5314 + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" 5315 + }, 5316 + "uri-js": { 5317 + "version": "4.2.2", 5318 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 5319 + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 5320 + "dev": true, 5321 + "requires": { 5322 + "punycode": "^2.1.0" 5323 + } 5324 + }, 5325 + "urix": { 5326 + "version": "0.1.0", 5327 + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 5328 + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 5329 + }, 5330 + "use": { 5331 + "version": "3.1.1", 5332 + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 5333 + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" 5334 + }, 5335 + "utf-8-validate": { 5336 + "version": "5.0.2", 5337 + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.2.tgz", 5338 + "integrity": "sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw==", 5339 + "requires": { 5340 + "node-gyp-build": "~3.7.0" 5341 + } 5342 + }, 5343 + "util-deprecate": { 5344 + "version": "1.0.2", 5345 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 5346 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 5347 + }, 5348 + "utile": { 5349 + "version": "0.3.0", 5350 + "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", 5351 + "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", 5352 + "requires": { 5353 + "async": "~0.9.0", 5354 + "deep-equal": "~0.2.1", 5355 + "i": "0.3.x", 5356 + "mkdirp": "0.x.x", 5357 + "ncp": "1.0.x", 5358 + "rimraf": "2.x.x" 5359 + }, 5360 + "dependencies": { 5361 + "async": { 5362 + "version": "0.9.2", 5363 + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 5364 + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" 5365 + }, 5366 + "deep-equal": { 5367 + "version": "0.2.2", 5368 + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", 5369 + "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" 5370 + }, 5371 + "ncp": { 5372 + "version": "1.0.1", 5373 + "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", 5374 + "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" 5375 + } 5376 + } 5377 + }, 5378 + "v8-compile-cache": { 5379 + "version": "2.1.0", 5380 + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 5381 + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 5382 + "dev": true 5383 + }, 5384 + "validate-npm-package-license": { 5385 + "version": "3.0.4", 5386 + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 5387 + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 5388 + "dev": true, 5389 + "requires": { 5390 + "spdx-correct": "^3.0.0", 5391 + "spdx-expression-parse": "^3.0.0" 5392 + } 5393 + }, 5394 + "which": { 5395 + "version": "1.3.1", 5396 + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 5397 + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 5398 + "dev": true, 5399 + "requires": { 5400 + "isexe": "^2.0.0" 5401 + } 5402 + }, 5403 + "which-boxed-primitive": { 5404 + "version": "1.0.1", 5405 + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", 5406 + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", 5407 + "requires": { 5408 + "is-bigint": "^1.0.0", 5409 + "is-boolean-object": "^1.0.0", 5410 + "is-number-object": "^1.0.3", 5411 + "is-string": "^1.0.4", 5412 + "is-symbol": "^1.0.2" 5413 + } 5414 + }, 5415 + "which-collection": { 5416 + "version": "1.0.1", 5417 + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 5418 + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 5419 + "requires": { 5420 + "is-map": "^2.0.1", 5421 + "is-set": "^2.0.1", 5422 + "is-weakmap": "^2.0.1", 5423 + "is-weakset": "^2.0.1" 5424 + } 5425 + }, 5426 + "wide-align": { 5427 + "version": "1.1.3", 5428 + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 5429 + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 5430 + "optional": true, 5431 + "requires": { 5432 + "string-width": "^1.0.2 || 2" 5433 + }, 5434 + "dependencies": { 5435 + "ansi-regex": { 5436 + "version": "3.0.0", 5437 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 5438 + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 5439 + "optional": true 5440 + }, 5441 + "is-fullwidth-code-point": { 5442 + "version": "2.0.0", 5443 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 5444 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 5445 + "optional": true 5446 + }, 5447 + "string-width": { 5448 + "version": "2.1.1", 5449 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 5450 + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 5451 + "optional": true, 5452 + "requires": { 5453 + "is-fullwidth-code-point": "^2.0.0", 5454 + "strip-ansi": "^4.0.0" 5455 + } 5456 + }, 5457 + "strip-ansi": { 5458 + "version": "4.0.0", 5459 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 5460 + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 5461 + "optional": true, 5462 + "requires": { 5463 + "ansi-regex": "^3.0.0" 5464 + } 5465 + } 5466 + } 5467 + }, 5468 + "window-size": { 5469 + "version": "0.1.4", 5470 + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", 5471 + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" 5472 + }, 5473 + "winston": { 5474 + "version": "0.8.3", 5475 + "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", 5476 + "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", 5477 + "requires": { 5478 + "async": "0.2.x", 5479 + "colors": "0.6.x", 5480 + "cycle": "1.0.x", 5481 + "eyes": "0.1.x", 5482 + "isstream": "0.1.x", 5483 + "pkginfo": "0.3.x", 5484 + "stack-trace": "0.0.x" 5485 + }, 5486 + "dependencies": { 5487 + "async": { 5488 + "version": "0.2.10", 5489 + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 5490 + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" 5491 + } 5492 + } 5493 + }, 5494 + "word-wrap": { 5495 + "version": "1.2.3", 5496 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 5497 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 5498 + "dev": true 5499 + }, 5500 + "wordwrap": { 5501 + "version": "0.0.3", 5502 + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 5503 + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 5504 + }, 5505 + "wrap-ansi": { 5506 + "version": "2.1.0", 5507 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 5508 + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 5509 + "requires": { 5510 + "string-width": "^1.0.1", 5511 + "strip-ansi": "^3.0.1" 5512 + }, 5513 + "dependencies": { 5514 + "ansi-regex": { 5515 + "version": "2.1.1", 5516 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 5517 + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 5518 + }, 5519 + "is-fullwidth-code-point": { 5520 + "version": "1.0.0", 5521 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 5522 + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 5523 + "requires": { 5524 + "number-is-nan": "^1.0.0" 5525 + } 5526 + }, 5527 + "string-width": { 5528 + "version": "1.0.2", 5529 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 5530 + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 5531 + "requires": { 5532 + "code-point-at": "^1.0.0", 5533 + "is-fullwidth-code-point": "^1.0.0", 5534 + "strip-ansi": "^3.0.0" 5535 + } 5536 + }, 5537 + "strip-ansi": { 5538 + "version": "3.0.1", 5539 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 5540 + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 5541 + "requires": { 5542 + "ansi-regex": "^2.0.0" 5543 + } 5544 + } 5545 + } 5546 + }, 5547 + "wrappy": { 5548 + "version": "1.0.2", 5549 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 5550 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 5551 + }, 5552 + "write": { 5553 + "version": "1.0.3", 5554 + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 5555 + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 5556 + "dev": true, 5557 + "requires": { 5558 + "mkdirp": "^0.5.1" 5559 + } 5560 + }, 5561 + "ws": { 5562 + "version": "7.2.3", 5563 + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", 5564 + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==" 5565 + }, 5566 + "xregexp": { 5567 + "version": "4.3.0", 5568 + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", 5569 + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", 5570 + "dev": true, 5571 + "requires": { 5572 + "@babel/runtime-corejs3": "^7.8.3" 5573 + }, 5574 + "dependencies": { 5575 + "@babel/runtime-corejs3": { 5576 + "version": "7.8.7", 5577 + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.7.tgz", 5578 + "integrity": "sha512-sc7A+H4I8kTd7S61dgB9RomXu/C+F4IrRr4Ytze4dnfx7AXEpCrejSNpjx7vq6y/Bak9S6Kbk65a/WgMLtg43Q==", 5579 + "dev": true, 5580 + "requires": { 5581 + "core-js-pure": "^3.0.0", 5582 + "regenerator-runtime": "^0.13.4" 5583 + } 5584 + }, 5585 + "regenerator-runtime": { 5586 + "version": "0.13.5", 5587 + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 5588 + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", 5589 + "dev": true 5590 + } 5591 + } 5592 + }, 5593 + "y18n": { 5594 + "version": "3.2.1", 5595 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 5596 + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 5597 + }, 5598 + "yallist": { 5599 + "version": "3.1.1", 5600 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 5601 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 5602 + "optional": true 5603 + }, 5604 + "yargs": { 5605 + "version": "3.32.0", 5606 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 5607 + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 5608 + "requires": { 5609 + "camelcase": "^2.0.1", 5610 + "cliui": "^3.0.3", 5611 + "decamelize": "^1.1.1", 5612 + "os-locale": "^1.4.0", 5613 + "string-width": "^1.0.1", 5614 + "window-size": "^0.1.4", 5615 + "y18n": "^3.2.0" 5616 + }, 5617 + "dependencies": { 5618 + "ansi-regex": { 5619 + "version": "2.1.1", 5620 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 5621 + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 5622 + }, 5623 + "is-fullwidth-code-point": { 5624 + "version": "1.0.0", 5625 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 5626 + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 5627 + "requires": { 5628 + "number-is-nan": "^1.0.0" 5629 + } 5630 + }, 5631 + "string-width": { 5632 + "version": "1.0.2", 5633 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 5634 + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 5635 + "requires": { 5636 + "code-point-at": "^1.0.0", 5637 + "is-fullwidth-code-point": "^1.0.0", 5638 + "strip-ansi": "^3.0.0" 5639 + } 5640 + }, 5641 + "strip-ansi": { 5642 + "version": "3.0.1", 5643 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 5644 + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 5645 + "requires": { 5646 + "ansi-regex": "^2.0.0" 5647 + } 5648 + } 5649 + } 5650 + }, 5651 + "zlib-sync": { 5652 + "version": "0.1.6", 5653 + "resolved": "https://registry.npmjs.org/zlib-sync/-/zlib-sync-0.1.6.tgz", 5654 + "integrity": "sha512-B2XGrhlXs/izEks+705vn/aL+nWyPgnS1glyCeH8wgZdOvztRn3ZEdqclj6GoJSeA/iRSqaTlznG2KO1M/GuWg==", 5655 + "requires": { 5656 + "nan": "^2.14.0" 5657 + } 5658 + }, 5659 + "zucc": { 5660 + "version": "0.1.2", 5661 + "resolved": "https://registry.npmjs.org/zucc/-/zucc-0.1.2.tgz", 5662 + "integrity": "sha512-G2x33eO7X79+7eSnwL9+uWYxxCEXk+P4BkcrVYpV6NTxynqjFhhiWLxbXsq5Lx4B36dYlXpvRoOk0a82TUKgRw==", 5663 + "requires": { 5664 + "bindings": "^1.5.0", 5665 + "node-addon-api": "^1.6.3" 5666 + }, 5667 + "dependencies": { 5668 + "bindings": { 5669 + "version": "1.5.0", 5670 + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 5671 + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 5672 + "requires": { 5673 + "file-uri-to-path": "1.0.0" 5674 + } 5675 + } 5676 + } 5677 + } 5678 + } 5679 + }
+73
package.json
··· 1 + { 2 + "name": "magibot", 3 + "version": "3.0.0", 4 + "description": "MagiBot - a Discord bot to build communities", 5 + "main": "dist/bot.js", 6 + "directories": { 7 + "doc": "docs", 8 + "test": "test" 9 + }, 10 + "dependencies": { 11 + "@types/ffprobe-static": "^2.0.0", 12 + "@types/mongodb": "^3.5.2", 13 + "axios": "^0.19.2", 14 + "blapi": "^1.3.1", 15 + "bufferutil": "^4.0.1", 16 + "dblapi.js": "^2.4.0", 17 + "discord.js": "^12.0.2", 18 + "dotenv": "^8.2.0", 19 + "ffmpeg-binaries": "^3.2.2", 20 + "ffprobe": "^1.1.0", 21 + "ffprobe-static": "^3.0.0", 22 + "forever": "^2.0.0", 23 + "libsodium-wrappers": "^0.7.6", 24 + "mongodb": "^3.5.5", 25 + "node-opus": "^0.3.3", 26 + "opusscript": "0.0.7", 27 + "systeminformation": "^4.23.1", 28 + "utf-8-validate": "^5.0.2", 29 + "zlib-sync": "^0.1.6", 30 + "zucc": "^0.1.2" 31 + }, 32 + "optionalDependencies": { 33 + "erlpack": "github:discordapp/erlpack", 34 + "@discordjs/opus": "^0.1.0" 35 + }, 36 + "devDependencies": { 37 + "@types/node": "^12.12.17", 38 + "@typescript-eslint/eslint-plugin": "^2.24.0", 39 + "@typescript-eslint/parser": "^2.24.0", 40 + "eslint": "^6.8.0", 41 + "eslint-config-airbnb": "^18.1.0", 42 + "eslint-config-prettier": "^6.10.0", 43 + "eslint-config-standard": "^14.1.0", 44 + "eslint-import-resolver-typescript": "^2.0.0", 45 + "eslint-plugin-import": "^2.20.1", 46 + "eslint-plugin-jsx-a11y": "^6.2.3", 47 + "eslint-plugin-node": "^10.0.0", 48 + "eslint-plugin-prettier": "^3.1.2", 49 + "eslint-plugin-react": "^7.19.0", 50 + "eslint-plugin-standard": "^4.0.1", 51 + "prettier": "^1.19.1", 52 + "typescript": "^3.8.3" 53 + }, 54 + "scripts": { 55 + "install-dev": "npm i --no-optional", 56 + "lint": "eslint .", 57 + "build": "tsc", 58 + "start": "forever start bot.js ; forever start ./test/bot.js ; forever start ./teapot/bot.js", 59 + "stop": "forever stop bot.js ; forever stop ./test/bot.js ; forever stop ./teapot/bot.js" 60 + }, 61 + "repository": { 62 + "type": "git", 63 + "url": "git+https://github.com/T0TProduction/MagiBot.git" 64 + }, 65 + "author": "Sebastian Di Luzio", 66 + "license": "ISC", 67 + "bugs": { 68 + "url": "https://github.com/T0TProduction/MagiBot/issues" 69 + }, 70 + "homepage": "https://github.com/T0TProduction/MagiBot#readme", 71 + "heroku-run-build-script": true, 72 + "snyk": true 73 + }
+124
src/bamands.ts
··· 1 + // commands made by Basti for use of the Bot 2 + import Discord, { Message } from 'discord.js'; 3 + 4 + export async function findMember( 5 + guild: Discord.Guild, 6 + ment: string, 7 + ): Promise<string | null> { 8 + if (!ment) { 9 + return null; 10 + } 11 + const mention = ment.toLowerCase(); 12 + if (mention.startsWith('<@') && mention.endsWith('>')) { 13 + let id = mention.slice(2, -1); 14 + if (id.startsWith('!')) { 15 + id = id.substr(1); 16 + } 17 + return id; 18 + } 19 + const user = guild.member(mention); 20 + if (user) { 21 + return user.id; 22 + } 23 + if (mention.length >= 3) { 24 + let memberArray = guild.members.cache.filter( 25 + (memb) => memb.displayName.toLowerCase().startsWith(mention), 26 + ); 27 + if (memberArray.size === 1) { 28 + return memberArray[0].id; 29 + } 30 + if (memberArray.size === 0) { 31 + memberArray = guild.members.cache.filter( 32 + (memb) => memb.displayName.toLowerCase().includes(mention), 33 + ); 34 + if (memberArray.size === 1) { 35 + return memberArray[0].id; 36 + } 37 + } 38 + } 39 + return null; 40 + } 41 + 42 + export async function findRole(guild: Discord.Guild, ment: string) { 43 + if (!ment) { 44 + return false; 45 + } 46 + const mention = ment.toLowerCase(); 47 + if (mention.startsWith('<@&') && mention.endsWith('>')) { 48 + const id = mention.substr(3).slice(0, -1); 49 + return id; 50 + } 51 + const role = await guild.roles.fetch(mention); 52 + if (role) { 53 + return role.id; 54 + } 55 + if (mention.length >= 3) { 56 + let roleArray = guild.roles.cache.filter((rol) => rol.name.toLowerCase().startsWith(mention)); 57 + if (roleArray.size === 1) { 58 + return roleArray[0].id; 59 + } 60 + if (roleArray.size === 0) { 61 + roleArray = guild.roles.cache.filter((rol) => rol.name.toLowerCase().includes(mention)); 62 + if (roleArray.size === 1) { 63 + return roleArray[0].id; 64 + } 65 + } 66 + } 67 + return false; 68 + } 69 + // this is an idea to implement rather reusable confirmation processes. 70 + // ; abortMessage, timeoutMessage and time are optional parameters 71 + export async function yesOrNo( 72 + msg: Discord.Message, 73 + question: string, 74 + abortMessage?: string, 75 + timeoutMessage?: string, 76 + tim?: number, 77 + ) { 78 + return msg.channel.send(question).then(async (mess) => { 79 + const filter = (reaction: Discord.MessageReaction, user: Discord.User) => (reaction.emoji.name === '☑' || reaction.emoji.name === '❌') 80 + && user.id === msg.author.id; 81 + await (mess as Message).react('☑'); 82 + await (mess as Message).react('❌'); 83 + let time = tim; 84 + if (!time) { 85 + time = 20000; 86 + } 87 + return (mess as Message) 88 + .awaitReactions(filter, { max: 1, time }) 89 + .then(async (reacts) => { 90 + (mess as Message).delete(); 91 + const firstReacts = reacts.first(); 92 + if (firstReacts && firstReacts.emoji.name === '☑') { 93 + return true; 94 + } 95 + if (firstReacts) { 96 + if (abortMessage) { 97 + msg.channel.send(abortMessage); 98 + } 99 + return false; 100 + } 101 + let message = timeoutMessage; 102 + if (!message) { 103 + message = 'Cancelled due to timeout.'; 104 + } 105 + await msg.channel.send(message); 106 + return false; 107 + }); 108 + }); 109 + } 110 + 111 + export function printError(error) { 112 + console.error( 113 + `Errorstatus: ${error.response.status} ${error.response.statusText}`, 114 + ); 115 + } 116 + 117 + export async function asyncForEach<T, F, O>( 118 + array: Array<T>, 119 + callback: (input: T, index: number, optionalParams?: O) => Promise<F>, 120 + optionalParams?: O, 121 + ) { 122 + const arr = array.map((e, i) => callback(e, i, optionalParams)); 123 + return Promise.all<F>(arr); 124 + }
+199
src/bot.ts
··· 1 + import Discord from 'discord.js'; 2 + import blapi from 'blapi'; 3 + import config from './token'; 4 + import data from './db'; 5 + import { 6 + PREFIX, 7 + PREFIXES, 8 + TOKEN, 9 + queueVoiceChannels, 10 + setUser, 11 + } from './shared_assets'; 12 + // eslint-disable-next-line import/no-cycle 13 + import { checkCommand } from './commandHandler'; 14 + 15 + export const bot = new Discord.Client(); 16 + 17 + // post to the APIs every 30 minutes 18 + if (config.blapis) { 19 + blapi.handle(bot, config.blapis, 30); 20 + } 21 + process.on('uncaughtException', async (err) => { 22 + const chann = await bot.channels.fetch('414809410448261132'); 23 + 24 + console.error(`Uncaught Exception:\n${err.stack ? err.stack : err}`); 25 + if (chann) { 26 + (chann as Discord.TextChannel).send( 27 + `**Outer Uncaught Exception:**\n\`\`\`${ 28 + err.stack ? err.stack : err 29 + }\`\`\``, 30 + ); 31 + } 32 + }); 33 + process.on('unhandledRejection', async (err) => { 34 + const chann = await bot.channels.fetch('414809410448261132'); 35 + 36 + console.error(`Unhandled promise rejection:\n${err}`); 37 + if (chann) { 38 + (chann as Discord.TextChannel).send( 39 + `**Outer Unhandled promise rejection:**\n\`\`\`${err}\`\`\``, 40 + ); 41 + } 42 + }); 43 + 44 + // fires on startup and on reconnect 45 + let justStartedUp = true; 46 + bot.on('ready', async () => { 47 + if (!bot.user) { 48 + throw new Error('FATAL Bot has no user.'); 49 + } 50 + setUser(bot.user); // give user ID to other code 51 + const chann = await bot.channels.fetch('382233880469438465'); 52 + if (!chann || chann.type !== 'text') { 53 + console.error('Tebots Server Channel not found.'); 54 + } 55 + if (justStartedUp) { 56 + (chann as Discord.TextChannel).send('Running startup...'); 57 + 58 + data.startup(bot); 59 + justStartedUp = false; 60 + } else { 61 + (chann as Discord.TextChannel).send('Just reconnected to Discord...'); 62 + } 63 + await bot.user.setPresence({ 64 + activity: { 65 + name: `${PREFIX}.help`, 66 + type: 'WATCHING', 67 + url: 'https://bots.ondiscord.xyz/bots/384820232583249921', 68 + }, 69 + status: 'online', 70 + }); 71 + data.getPrefixesE(bot); 72 + }); 73 + 74 + bot.on('message', async (msg) => { 75 + try { 76 + await checkCommand(msg as Discord.Message, bot); 77 + } catch (err) { 78 + console.error(err); 79 + } 80 + }); 81 + 82 + async function guildPrefixStartup(guild) { 83 + try { 84 + await data.addGuild(guild.id); 85 + PREFIXES[guild.id] = await data.getPrefixE(guild.id); 86 + } catch (err) { 87 + console.error(err); 88 + } 89 + } 90 + 91 + bot.on('guildCreate', async (guild) => { 92 + if (guild.available) { 93 + await guildPrefixStartup(guild); 94 + if (guild.owner) { 95 + guild.owner 96 + .send( 97 + `Hi there ${guild.owner.displayName}.\nThanks for adding me to your server! If you have any need for help or want to help develop the bot by reporting bugs and requesting features, just join https://discord.gg/2Evcf4T\n\nTo setup the bot, use \`${PREFIX}:help setup\`.\nYou should:\n\t- setup an admin role, as only you and users with administrative permission are able to use admin commands (\`${PREFIX}:setup admin @role\`)\n\t- add some text channels where users can use the bot (\`${PREFIX}:setup command\`)\n\t- add voice channels in which the bot is allowed to ` 98 + + `join to use joinsounds (\`${PREFIX}:setup join\`)\n\t- add a notification channel where bot updates and information will be posted (\`${PREFIX}:setup notification\`)\n\nTo make sure the bot can use all its functions consider giving it a role with administrative rights, if you have not done so yet in the invitation.\n\nThanks for being part of this project,\nBasti aka. the MagiBot Dev`, 99 + ) 100 + .catch(() => {}); 101 + } 102 + const chan = await bot.channels.fetch('408611226998800390'); 103 + if (chan && chan.type === 'text') { 104 + (chan as Discord.TextChannel).send( 105 + `:white_check_mark: joined **${guild.name}** from ${guild.region} (${guild.memberCount} users, ID: ${guild.id})\nOwner is: <@${guild.ownerID}> (ID: ${guild.ownerID})`, 106 + ); 107 + } 108 + } 109 + }); 110 + 111 + bot.on('guildDelete', async (guild) => { 112 + if (guild.available) { 113 + const chan = await bot.channels.fetch('408611226998800390'); 114 + if (chan && chan.type === 'text') { 115 + (chan as Discord.TextChannel).send( 116 + `:x: left ${guild.name} (${guild.memberCount} users, ID: ${guild.id})`, 117 + ); 118 + } 119 + } 120 + }); 121 + 122 + bot.on('error', (err) => { 123 + console.error(err); 124 + }); 125 + 126 + bot.on('voiceStateUpdate', async (o, n) => { 127 + try { 128 + const newVc = n.channel; 129 + // check if voice channel actually changed, don't mute bots 130 + if (!n.member?.user.bot && o.channel?.id !== newVc?.id) { 131 + // is muted and joined a vc? maybe still muted from queue 132 + if (n.serverMute && (await data.isStillMuted(n.id, n.guild.id))) { 133 + n.setMute( 134 + false, 135 + 'was still muted from a queue which user disconnected from', 136 + ); 137 + data.toggleStillMuted(n.id, n.guild.id, false); 138 + } 139 + if ( 140 + !n.serverMute 141 + && queueVoiceChannels[n.guild.id] 142 + && queueVoiceChannels[n.guild.id] === newVc?.id 143 + ) { 144 + // user joined a muted channel 145 + n.setMute(true, 'joined active queue voice channel'); 146 + } else if ( 147 + n.serverMute 148 + && queueVoiceChannels[o.guild.id] 149 + && queueVoiceChannels[o.guild.id] === o.channel?.id 150 + ) { 151 + // user left a muted channel 152 + if (newVc) { 153 + n.setMute(false, 'left active queue voice channel'); 154 + } else { 155 + // save the unmute for later 156 + data.toggleStillMuted(n.id, n.guild.id, true); 157 + } 158 + } else if ( 159 + newVc 160 + && !n.guild?.me?.voice.channel 161 + && n.id !== bot.user?.id 162 + && !(await data.isBlacklistedUser(n.id, n.guild.id)) 163 + && (await data.joinable(n.guild.id, newVc.id)) 164 + ) { 165 + if (n.guild.me && newVc?.permissionsFor(n.guild.me)?.has('CONNECT')) { 166 + const sound = await data.getSound(n.id, n.guild.id); 167 + if (sound) { 168 + newVc.join().then((connection) => { 169 + if (connection) { 170 + // TODO use connection.play when discord.js updates 171 + const dispatcher = connection.play(sound, { 172 + seek: 0, 173 + volume: 0.2, 174 + bitrate: 'auto', 175 + }); 176 + dispatcher.once('end', () => { 177 + connection.disconnect(); 178 + dispatcher.removeAllListeners(); // To be sure noone listens to this anymore 179 + }); 180 + dispatcher.once('error', () => { 181 + connection.disconnect(); 182 + dispatcher.removeAllListeners(); // To be sure noone listens to this anymore 183 + }); 184 + } 185 + }); 186 + } 187 + } 188 + } 189 + } 190 + } catch (err) { 191 + console.error(err); 192 + } 193 + }); 194 + 195 + bot.on('disconnected', () => { 196 + console.log('Disconnected!'); 197 + }); 198 + 199 + bot.login(TOKEN); // connect to discord
+6
src/commandCollector.ts
··· 1 + 2 + import { help } from './commands/help'; 3 + 4 + export const commands:{[k:string]:magibotCommand} = { 5 + help, 6 + };
+179
src/commandHandler.ts
··· 1 + import Discord, { Message } from 'discord.js'; 2 + import { vote } from './commands/vote'; 3 + import { sound } from './commands/sound'; 4 + import { rfact } from './commands/rfact'; 5 + // eslint-disable-next-line import/no-cycle 6 + import { stats } from './commands/stats'; 7 + import { salt } from './commands/salt'; 8 + // we allow this cycle once, as the help command also needs to list itself 9 + import { help } from './commands/help'; // eslint-disable-line import/no-cycle 10 + 11 + import data from './db'; 12 + import { 13 + PREFIXES, OWNERID, DELETE_COMMANDS, user, 14 + } from './shared_assets'; 15 + 16 + export const commands:{[k:string]:magibotCommand} = { 17 + help, salt, stats, rfact, sound, vote, 18 + }; 19 + 20 + async function catchError(error:Error, msg:Discord.Message, command:string, bot:Discord.Client) { 21 + console.error(`Caught:\n${error.stack}\nin command ${command} ${msg.content}`); 22 + const chann = await bot.channels.fetch('414809410448261132'); 23 + if (chann) { 24 + (chann as Discord.TextChannel).send(`**Command:** ${command} ${msg.content}\n**Caught Error:**\n\`\`\`${error.stack}\`\`\``); 25 + } 26 + msg.reply(`something went wrong while using ${command}. The devs have been automatically notified. 27 + If you can reproduce this, consider using \`${PREFIXES[msg.guild?.id || 0]}.bug <bugreport>\` or join the support discord (link via \`${PREFIXES[msg.guild?.id || 0]}.info\`) to tell us exactly how.`); 28 + } 29 + 30 + const userCooldowns = new Set<string>(); 31 + 32 + // TODO check why the bot also gives us Discord.PartialMessage, as thats not what we want 33 + export async function checkCommand(msg:Discord.Message, bot:Discord.Client) { 34 + if (!(msg.author && msg.guild && msg.guild.me)) { 35 + // check for valid message 36 + console.error('Invalid message received:', msg); 37 + return; 38 + } 39 + if (!(!msg.author.bot && msg.channel.type === 'text')) { 40 + // check for in guild and text channel 41 + return; 42 + } 43 + let isMention:boolean; 44 + if ( 45 + msg.content.startsWith(`<@${user().id}>`) 46 + || msg.content.startsWith(`<@!${user().id}>`) 47 + ) { 48 + isMention = true; 49 + } else if (msg.content.startsWith(PREFIXES[msg.guild.id])) { 50 + isMention = false; 51 + } else { 52 + return; 53 + } 54 + // ignore blacklisted users 55 + if (await data.isBlacklistedUser(msg.author.id, msg.guild.id)) { 56 + msg.delete(); 57 + return; 58 + } 59 + let command:string; 60 + let content:string; 61 + if (isMention) { 62 + command = msg.content.split(' ')[1]; // eslint-disable-line prefer-destructuring 63 + content = msg.content 64 + .split(' ') 65 + .splice(2, msg.content.split(' ').length) 66 + .join(' '); 67 + command = `.${command}`; 68 + } else { 69 + command = msg.content 70 + .substring(PREFIXES[msg.guild.id].length, msg.content.length) 71 + .split(' ')[0] 72 + .toLowerCase(); 73 + content = msg.content.slice( 74 + command.length + PREFIXES[msg.guild.id].length, 75 + ); // delete prefix and command 76 + content = msg.content.replace(/^\s+/g, ''); // delete leading spaces 77 + } 78 + if (command) { 79 + let commandVal:string; 80 + const pre = command.charAt(0); 81 + const myPerms = (msg.channel as Discord.TextChannel).permissionsFor(msg.guild.me); 82 + if (pre === '.') { 83 + command = command.slice(1); 84 + commandVal = command; 85 + } else if (pre === ':') { 86 + command = `@${command.slice(1)}`; 87 + commandVal = command.slice(1); 88 + // Check if its an admin command 89 + // if not you're allowed to use the normal version as admin (in any channel) 90 + if (!commands[command]) { 91 + command = command.slice(1); 92 + } 93 + // Check if the command exists, to not just spam k: msgs 94 + if (!commands[command]) { 95 + return; 96 + } 97 + if (!(msg.member && (await data.isAdmin(msg.guild.id, msg.member)))) { 98 + if (myPerms) { 99 + if (myPerms.has('MANAGE_MESSAGES')) { 100 + msg.delete(); 101 + } 102 + if (myPerms.has('SEND_MESSAGES')) { 103 + msg.reply("you're not allowed to use this command.") 104 + .then((mess) => (mess as Discord.Message).delete({ timeout: 5000 })); 105 + } 106 + } 107 + return; 108 + } 109 + } else { 110 + return; 111 + } 112 + 113 + if ( 114 + commands[command] 115 + && (!commands[command].dev || msg.author.id === OWNERID) 116 + ) { 117 + if ( 118 + pre === ':' 119 + || (await data.commandAllowed(msg.guild.id, msg.channel.id)) 120 + ) { 121 + const perms = commands[command].perm; 122 + if ( 123 + !perms 124 + || (myPerms && myPerms.has(perms)) 125 + ) { 126 + // cooldown for command usage 127 + if (!userCooldowns.has(msg.author.id)) { 128 + userCooldowns.add(msg.author.id); 129 + setTimeout(() => { 130 + userCooldowns.delete(msg.author.id); 131 + }, 4000); 132 + try { 133 + await commands[command].main(content, msg); 134 + } catch (err) { 135 + catchError( 136 + err, 137 + msg, 138 + `${PREFIXES[msg.guild.id]}${pre}${commandVal}`, 139 + bot, 140 + ); 141 + } 142 + data.usageUp(msg.author.id, msg.guild.id); 143 + } else if (myPerms && myPerms.has('SEND_MESSAGES') 144 + ) { 145 + msg.reply("whoa cool down, you're using commands too quick!"); 146 + } 147 + // endof cooldown management 148 + } else if ( 149 + myPerms && myPerms.has('SEND_MESSAGES') 150 + ) { 151 + msg.channel.send( 152 + `I don't have the permissions needed for this command. (${perms}) `, 153 + ); 154 + } 155 + } else if ( 156 + myPerms && myPerms.has('SEND_MESSAGES') 157 + ) { 158 + if ( 159 + myPerms && myPerms.has('MANAGE_MESSAGES') 160 + ) { 161 + msg.delete(); 162 + } 163 + msg 164 + .reply( 165 + `commands aren't allowed in <#${ 166 + msg.channel.id 167 + }>. Use them in ${await data.commandChannel( 168 + msg.guild.id, 169 + )}. If you're an admin use \`${ 170 + PREFIXES[msg.guild.id] 171 + }:help\` to see how you can change that.`, 172 + ) 173 + .then((mess) => (mess as Message).delete({ timeout: 15000 })); 174 + } 175 + } 176 + } 177 + 178 + if (DELETE_COMMANDS) msg.delete(); 179 + };
+89
src/commands-disabled/@strike.ts
··· 1 + import data from '../db'; 2 + import { 3 + findMember, 4 + } from '../bamands'; 5 + 6 + function printHelp() { 7 + const info : Array<{ name: string; value: string }> = []; 8 + 9 + info.push({ 10 + name: '<@user|userid|nickname>', 11 + value: 'Strike a user for breaking your server rules. The third strike will lead to a temporary ban.', 12 + }); 13 + 14 + info.push({ 15 + name: 'undo <@user|userid|nickname>', 16 + value: 'Remove a strike from a user.', 17 + }); 18 + 19 + return info; 20 + } 21 + 22 + module.exports = { 23 + main: async function main(bot, msg) { 24 + // TODO change all of this 25 + const args = msg.content.split(/ +/); 26 + const command = args[0].toLowerCase(); 27 + if (msg.guild) { 28 + const mention = args[1]; 29 + const uid = await findMember(msg.guild, mention); 30 + if (!(mention && uid)) { 31 + if (command === 'reset') { 32 + msg.channel.send('Do you really want to reset all salt on this server?').then((mess) => { 33 + const filter = (reaction, user) => (reaction.emoji.name === '☑' || reaction.emoji.name === '❌') && user.id === msg.author.id; 34 + mess.react('☑'); 35 + mess.react('❌'); 36 + mess.awaitReactions(filter, { 37 + max: 1, 38 + time: 20000, 39 + }).then((reacts) => { 40 + mess.delete(); 41 + if (reacts.first() && reacts.first().emoji.name === '☑') { 42 + data.resetSalt(msg.guild); 43 + msg.channel.send(`Successfully reset all salt on **${msg.guild.name}**!`); 44 + } else if (reacts.first()) { 45 + msg.channel.send('Successfully canceled salt reset.'); 46 + } 47 + }); 48 + }); 49 + return; 50 + } 51 + msg.reply('you need to mention a user you want to use this on!'); 52 + return; 53 + } 54 + switch (command) { 55 + case 'add': 56 + if (uid === bot.user.id) { 57 + msg.reply("you can't report me!"); 58 + return; 59 + } 60 + await data.saltUpAdmin(uid, msg.author.id, msg.guild); 61 + msg.channel.send(`Successfully reported <@!${uid}> for being a salty bitch!`); 62 + break; 63 + case 'rem': 64 + if (await data.remOldestSalt(uid, msg.guild)) { 65 + msg.channel.send(`Successfully removed the oldest salt from <@!${uid}>!`); 66 + } else { 67 + msg.channel.send(`<@!${uid}> has no salt that could be removed!`); 68 + } 69 + break; 70 + case 'clr': 71 + await data.clrSalt(uid, msg.guild); 72 + msg.channel.send(`Successfully cleared all salt from <@!${uid}>!`); 73 + break; 74 + default: 75 + msg.reply(`this command doesn't exist. Use \`${bot.PREFIXES[msg.guild.id]}:help salt\` to get more info.`); 76 + break; 77 + } 78 + } else { 79 + msg.reply('Commands are only available on guilds.'); 80 + } 81 + }, 82 + ehelp() { 83 + return printHelp(); 84 + }, 85 + perm: 'SEND_MESSAGES', 86 + admin: true, 87 + hide: false, 88 + category: 'Utility', 89 + };
+7
src/commands-disabled/@warn.js
··· 1 + /* module.exports = { 2 + main: (bot, msg) => { 3 + // TODO warn channel usage, rule break 4 + }, 5 + admin: true, 6 + }; 7 + */
+18
src/commands-disabled/roles.js
··· 1 + // const avroles = { Switch: 'Switch' }; 2 + module.exports = { 3 + main(bot, msg) { 4 + /* var role=(msg.content.split(" "))[0]; 5 + if(avroles[role]){ 6 + msg.member.addRole(avroles[role]); 7 + msg.reply("dir wurde erfolgreich die Rolle "+role+" zugewiesen."); 8 + } 9 + else{ 10 + if(role!==''){ 11 + msg.reply("die Rolle "+role+" existiert nicht."); 12 + }else{ */ 13 + msg.channel.send("Getting other roles is as simple as this: Type t!selfroles get role in <#198764451132997632>\nDont @mention the role, you'll only spam notifications!\nExample usage: t!selfroles get Switch\nAvailable roles:\nSwitch, League of Legends, Dauntless, Town of Salem, Fortnite, Civilization, PUBG\n☝ if <@172002275412279296> is offline this won't work❗\nthe roles are mainly to find people to play with in <#365179633857200138>"); 14 + // } 15 + // } 16 + }, 17 + admin: false, 18 + };
+25
src/commands/@dblist.ts
··· 1 + import { bot } from '../bot'; 2 + import data from '../db'; 3 + import { asyncForEach } from '../bamands'; 4 + import { commandCategories } from '../types/enums'; 5 + 6 + export const dblist: magibotCommand = { 7 + name: 'dblist', 8 + async main(content, msg) { 9 + const users = await data.getDBLSubs(); 10 + let str = `There are ${users.length} users currently subscribed to the DBL vote reminder:\n\n`; 11 + asyncForEach(users, async (u, i) => { 12 + // eslint-disable-next-line no-underscore-dangle 13 + str += `${i}. ${(await bot.users.fetch(u._id)).username} - voted: ${u.voted}\n`; 14 + }); 15 + msg.channel.send(str); 16 + }, 17 + ehelp() { 18 + return [{ name: '', value: 'get all users that are subscribed to the dbl reminder.' }]; 19 + }, 20 + perm: 'SEND_MESSAGES', 21 + dev: true, 22 + admin: true, 23 + hide: true, 24 + category: commandCategories.misc, 25 + };
+17
src/commands/@dc.ts
··· 1 + import { commandCategories } from '../types/enums'; 2 + 3 + export const dc: magibotCommand = { 4 + name: 'dc', 5 + ehelp: () => ([]), 6 + main: async (content, msg) => { 7 + await msg.channel.send('Shutting down...'); 8 + setTimeout(() => { 9 + process.exit(); 10 + }, 2000); 11 + }, 12 + admin: true, 13 + perm: ['SEND_MESSAGES', 'MANAGE_GUILD'], 14 + hide: true, 15 + dev: true, 16 + category: commandCategories.util, 17 + };
+17
src/commands/@eval.ts
··· 1 + import { commandCategories } from '../types/enums'; 2 + 3 + export const evall: magibotCommand = { 4 + name: 'eval', 5 + ehelp: () => [], 6 + main: async (content, msg) => { 7 + msg.channel.send(`input:\n\`\`\`js\n${content}\`\`\``); 8 + // eslint-disable-next-line no-eval 9 + const evaluation = await eval(content); 10 + msg.channel.send(`output:\n\`\`\`js\n${evaluation}\`\`\``); 11 + }, 12 + admin: true, 13 + dev: true, 14 + hide: true, 15 + perm: 'SEND_MESSAGES', 16 + category: commandCategories.util, 17 + };
+435
src/commands/@queue.ts
··· 1 + import { TextChannel, VoiceChannel, User } from 'discord.js'; 2 + import { bot } from '../bot'; 3 + import data from '../db'; 4 + import { yesOrNo } from '../bamands'; 5 + import { user, queueVoiceChannels } from '../shared_assets'; 6 + import { commandCategories } from '../types/enums'; 7 + 8 + const used: { [k: string]: { date: Date; msg: string; cid: string } } = {}; 9 + 10 + function messageEdit( 11 + voiceChannel: VoiceChannel | null | undefined, 12 + activeUser: User | undefined, 13 + qU: Array<User>, 14 + topic: string, 15 + ) { 16 + let msg = `Queue: **${topic}**`; 17 + if (voiceChannel) { 18 + msg += `\n*with voicemode activated in* ${voiceChannel}`; 19 + } 20 + let tmpms = '\n'; 21 + if (qU.length > 0) { 22 + for (let i = 0; i < 10 && i < qU.length; i++) { 23 + tmpms += `- ${qU[i]}\n`; 24 + } 25 + } else { 26 + tmpms = ' no more queued users\n'; 27 + } 28 + msg += `\n*${qU.length} queued users left*\n\nCurrent user: **${activeUser}**\n\nNext up are:${tmpms}\nUse ☑ to join and ❌ to leave the queue!`; 29 + return msg; 30 + } 31 + 32 + export const queue: magibotCommand = { 33 + hide: false, 34 + name: 'queue', 35 + async main(content, msg) { 36 + if (!msg.guild) { 37 + return; 38 + } 39 + let voiceChannel: VoiceChannel | null | undefined; 40 + if (used[msg.guild.id]) { 41 + const d = new Date(); 42 + if (d.getTime() - used[msg.guild.id].date.getTime() <= 0) { 43 + // check if its already 2hours old 44 + if (used[msg.guild.id].msg && used[msg.guild.id].cid) { 45 + const testchann = msg.guild.channels.cache.get( 46 + used[msg.guild.id].cid, 47 + ); 48 + if ( 49 + testchann 50 + && (await (testchann as TextChannel).messages 51 + .fetch(used[msg.guild.id].msg) 52 + .catch(() => {})) 53 + ) { 54 + msg.channel.send( 55 + "There's already an ongoing queue on this guild. For performance reasons only one queue per guild is allowed.", 56 + ); 57 + return; 58 + } 59 + } else { 60 + msg.channel.send( 61 + "There's currently a queue being created on this guild. For performance reasons only one queue per guild is allowed.", 62 + ); 63 + return; 64 + } 65 + } 66 + } 67 + used[msg.guild.id] = { 68 + date: new Date(Date.now() + 3600000), 69 + msg: '', 70 + cid: '', 71 + }; 72 + const authorID = msg.author.id; 73 + msg.channel.send('What do you want the queue to be about?').then((mess) => { 74 + msg.delete(); 75 + msg.channel 76 + .awaitMessages((m) => m.author.id === authorID, { 77 + max: 1, 78 + time: 60000, 79 + }) 80 + .then((collected) => { 81 + if (!collected.first()) { 82 + msg.channel.send('Cancelled queue creation due to timeout.'); 83 + delete used[msg.guild!.id]; 84 + return; 85 + } 86 + const topic = collected.first()!.content; 87 + collected.first()!.delete(); 88 + mess.delete(); 89 + msg.channel 90 + .send( 91 + 'How long is this queue supposed to last? *(in minutes, maximum of 120)*', 92 + ) 93 + .then((mess2) => { 94 + msg.channel 95 + .awaitMessages((m) => m.author.id === authorID, { 96 + max: 1, 97 + time: 60000, 98 + }) 99 + .then(async (collected2) => { 100 + if (!collected2.first()) { 101 + msg.channel.send( 102 + 'Cancelled queue creation due to timeout.', 103 + ); 104 + delete used[msg.guild!.id]; 105 + return; 106 + } 107 + let time = parseInt(collected2.first()!.content, 10); 108 + if (!time) { 109 + msg.channel.send( 110 + 'Thats not a real number duh. Cancelled queue creation, try again.', 111 + ); 112 + delete used[msg.guild!.id]; 113 + return; 114 + } 115 + if (time > 120) { 116 + time = 120; 117 + } else if (time < 1) { 118 + time = 1; 119 + } 120 + collected2.first()!.delete(); 121 + mess2.delete(); 122 + const authorMember = await msg.guild?.members.fetch( 123 + msg.author 124 + ); 125 + voiceChannel = authorMember?.voice.channel; 126 + let remMessage; 127 + if (voiceChannel) { 128 + const botMember = await msg.guild?.members.fetch(user()); 129 + if (!botMember?.hasPermission('MUTE_MEMBERS')) { 130 + remMessage = await msg.channel.send( 131 + 'If i had MUTE_MEMBERS permission i would be able to (un)mute users in the voice channel automatically. If you want to use that feature restart the command after giving me the additional permissions.', 132 + ); 133 + voiceChannel = null; 134 + } else if ( 135 + await yesOrNo( 136 + msg, 137 + `Do you want to automatically (un)mute users based on their turn in ${voiceChannel}? `, 138 + ) 139 + ) { 140 + remMessage = await msg.channel.send( 141 + `Automatically (un)muting users in ${voiceChannel}. This means everyone except users that are considered admin by MagiBot is muted by default.`, 142 + ); 143 + } else { 144 + remMessage = await msg.channel.send( 145 + `Deactivated automatic (un)muting in ${voiceChannel}.`, 146 + ); 147 + voiceChannel = null; 148 + } 149 + } else { 150 + remMessage = await msg.channel.send( 151 + 'If you were in a voice channel while setting this up i could automatically (un)mute users. Restart the whole process to do so, if you wish to.', 152 + ); 153 + } 154 + msg.channel 155 + .send( 156 + `Do you want to start the queue **${topic}** lasting **${time} minutes** ?`, 157 + ) 158 + .then(async (mess3) => { 159 + const filter = (reaction, usr) => (reaction.emoji.name === '☑' 160 + || reaction.emoji.name === '❌') 161 + && usr.id === authorID; 162 + await mess3.react('☑'); 163 + await mess3.react('❌'); 164 + mess3 165 + .awaitReactions(filter, { 166 + max: 1, 167 + time: 20000, 168 + }) 169 + .then(async (reacts) => { 170 + await mess3.delete(); 171 + await remMessage.delete(); 172 + if ( 173 + reacts.first() 174 + && reacts.first()!.emoji.name === '☑' 175 + ) { 176 + msg.channel 177 + .send( 178 + `Queue: **${topic}:**\n\nUse ☑ to join the queue!`, 179 + ) 180 + .then(async (mess4) => { 181 + const chann = await bot.channels.fetch( 182 + '433357857937948672', 183 + ); 184 + await mess4.react('➡'); 185 + await mess4.react('☑'); 186 + await mess4.react('❌'); 187 + await mess4.react('🔚'); 188 + const fil = (reaction, usr) => reaction.emoji.name === '☑' 189 + || reaction.emoji.name === '❌' 190 + || ((reaction.emoji.name === '➡' 191 + || reaction.emoji.name === '🔚') 192 + && usr.id === authorID); 193 + time *= 60000; 194 + const queuedUsers: Array<User> = []; 195 + let activeUser: User | undefined; 196 + const collector = mess4.createReactionCollector( 197 + fil, 198 + { 199 + time, 200 + }, 201 + ); 202 + const deleteme = await (chann as TextChannel).send( 203 + `Started queue **${topic}** on server **${mess4.guild}**`, 204 + ); 205 + used[msg.guild!.id] = { 206 + date: new Date(Date.now() + time), 207 + cid: mess4.channel.id, 208 + msg: mess4.id, 209 + }; 210 + 211 + if (voiceChannel) { 212 + // add the vc to the global variable so joins get muted 213 + queueVoiceChannels[msg.guild!.id] = voiceChannel.id; 214 + // servermute all users in voiceChannel 215 + const memArray = voiceChannel.members.array(); 216 + memArray.forEach(async (val) => { 217 + const mem = voiceChannel!.members.get( 218 + val.id, 219 + ); 220 + if ( 221 + mem 222 + && !(await data.isAdmin(msg.guild!.id, mem)) 223 + ) { 224 + mem.voice.setMute( 225 + true, 226 + 'Queue started in this voice channel', 227 + ); 228 + } 229 + }); 230 + } 231 + 232 + collector.on( 233 + 'collect', 234 + async (r, userThatReacted) => { 235 + switch (r.emoji.name) { 236 + case '☑': 237 + if ( 238 + !queuedUsers.includes( 239 + userThatReacted, 240 + ) 241 + && userThatReacted !== activeUser 242 + && userThatReacted.id !== user().id 243 + ) { 244 + if (activeUser) { 245 + queuedUsers.push(userThatReacted); 246 + const reactn = mess4.reactions.cache.get( 247 + '❌', 248 + ); 249 + if (reactn) { 250 + reactn.users.remove( 251 + userThatReacted, 252 + ); 253 + } 254 + } else { 255 + activeUser = userThatReacted; 256 + r.users.remove(activeUser); 257 + msg.channel 258 + .send( 259 + `It's your turn ${activeUser}!`, 260 + ) 261 + .then((ms) => { 262 + ms.delete({ timeout: 1000 }); 263 + }); 264 + if (voiceChannel) { 265 + // unmute currentUser 266 + const currentMember = await msg.guild?.members.fetch( 267 + activeUser 268 + ); 269 + if (currentMember) { 270 + currentMember.voice.setMute( 271 + false, 272 + 'Its their turn in the queue', 273 + ); 274 + } 275 + } 276 + } 277 + mess4.edit( 278 + messageEdit( 279 + voiceChannel, 280 + activeUser, 281 + queuedUsers, 282 + topic, 283 + ), 284 + ); 285 + } 286 + break; 287 + case '➡': 288 + if (queuedUsers[0]) { 289 + if (voiceChannel) { 290 + // mute old current user 291 + if (activeUser) { 292 + const currentMember = await msg.guild!.members.fetch( 293 + activeUser, 294 + ); 295 + currentMember.voice.setMute( 296 + true, 297 + 'its not your turn in the queue anymore', 298 + ); 299 + } 300 + } 301 + activeUser = queuedUsers.shift()!; 302 + r.users.remove(userThatReacted); 303 + mess4.edit( 304 + messageEdit( 305 + voiceChannel, 306 + activeUser, 307 + queuedUsers, 308 + topic, 309 + ), 310 + ); 311 + const reactn = mess4.reactions.cache.get( 312 + '☑', 313 + ); 314 + if (reactn) { 315 + reactn.users.remove(activeUser); 316 + } 317 + msg.channel 318 + .send( 319 + `It's your turn ${activeUser}!`, 320 + ) 321 + .then((ms) => { 322 + ms.delete({ timeout: 1000 }); 323 + }); 324 + if (voiceChannel) { 325 + // unmute currentUser 326 + const currentMember = await msg.guild?.members.fetch( 327 + activeUser 328 + ); 329 + if (currentMember) { 330 + currentMember.voice.setMute( 331 + false, 332 + 'Its their turn in the queue', 333 + ); 334 + } 335 + } 336 + } else { 337 + msg.channel 338 + .send('No users left in queue.') 339 + .then((ms) => { 340 + ms.delete({ timeout: 2000 }); 341 + }); 342 + } 343 + r.users.remove(authorID); 344 + break; 345 + case '❌': 346 + if ( 347 + queuedUsers.includes( 348 + userThatReacted, 349 + ) 350 + && userThatReacted.id !== user().id 351 + ) { 352 + r.users.remove(userThatReacted); 353 + const rctn = mess4.reactions.cache.get( 354 + '☑', 355 + ); 356 + if (rctn) { 357 + rctn.users.remove(userThatReacted); 358 + } 359 + const ind = queuedUsers.findIndex( 360 + (obj) => obj.id === userThatReacted.id, 361 + ); 362 + queuedUsers.splice(ind, 1); 363 + mess4.edit( 364 + messageEdit( 365 + voiceChannel, 366 + activeUser, 367 + queuedUsers, 368 + topic, 369 + ), 370 + ); 371 + } 372 + break; 373 + case '🔚': 374 + msg.channel 375 + .send('Successfully ended queue.') 376 + .then((ms) => { 377 + ms.delete({ timeout: 5000 }); 378 + }); 379 + collector.stop(); 380 + break; 381 + default: 382 + break; 383 + } 384 + }, 385 + ); 386 + collector.on('end', () => { 387 + deleteme.delete(); 388 + delete used[msg.guild!.id]; 389 + if (voiceChannel) { 390 + delete queueVoiceChannels[msg.guild!.id]; 391 + // remove all mutes 392 + voiceChannel.members 393 + .array() 394 + .forEach((mem) => { 395 + mem.voice.setMute(false, 'queue ended'); 396 + }); 397 + } 398 + mess4 399 + .edit(`**${topic}** ended.`) 400 + .catch(() => {}); 401 + mess4.reactions.removeAll().catch(() => {}); 402 + }); 403 + }); 404 + } else if (reacts.first()) { 405 + msg.channel.send( 406 + `successfully canceled queue **${topic}**`, 407 + ); 408 + delete used[msg.guild!.id]; 409 + } else { 410 + msg.channel.send( 411 + `Cancelled queue creation of **${topic}** due to timeout.`, 412 + ); 413 + delete used[msg.guild!.id]; 414 + } 415 + }); 416 + }); 417 + }); 418 + }); 419 + }); 420 + }); 421 + }, 422 + ehelp() { 423 + return [ 424 + { 425 + name: '', 426 + value: 427 + 'Start a queue that can last up to 2h. There is only a single queue allowed per guild.\nYou can activate an optional voicemode which will automatically (un)mute users if you start the queue while connected to a voicechannel.\nYou get all the setup instructions when using the command.', 428 + }, 429 + ]; 430 + }, 431 + admin: true, 432 + perm: ['SEND_MESSAGES', 'MANAGE_MESSAGES'], 433 + dev: false, 434 + category: commandCategories.util, 435 + };
+128
src/commands/@salt.ts
··· 1 + import { GuildMember } from 'discord.js'; 2 + import { commandCategories } from '../types/enums'; 3 + import { PREFIXES } from '../shared_assets'; 4 + import data from '../db'; 5 + import { findMember, yesOrNo } from '../bamands'; 6 + 7 + function printHelp() { 8 + const info: Array<{ name: string; value: string }> = []; 9 + 10 + info.push({ 11 + name: 'add <@user|userid|nickname>', 12 + value: 'Report a user for being salty', 13 + }); 14 + 15 + info.push({ 16 + name: 'rem <@user|userid|nickname>', 17 + value: 'Remove the oldest salt report of a user', 18 + }); 19 + 20 + info.push({ 21 + name: 'clr <@user|userid|nickname>', 22 + value: 'Clear all salt of a user', 23 + }); 24 + 25 + info.push({ 26 + name: 'reset', 27 + value: 'Reset all salt of this guild. Use with caution', 28 + }); 29 + 30 + return info; 31 + } 32 + 33 + export const salt: magibotCommand = { 34 + dev: false, 35 + name: 'salt', 36 + main: async function main(bot, msg) { 37 + const args = msg.content.split(/ +/); 38 + const command = args[0].toLowerCase(); 39 + if (msg.guild) { 40 + const mention = args[1]; 41 + const uid = await findMember(msg.guild, mention); 42 + if (!(mention && uid)) { 43 + if (command === 'reset') { 44 + if ( 45 + await yesOrNo( 46 + msg, 47 + 'Do you really want to reset all salt on this server?', 48 + 'Successfully canceled salt reset.', 49 + ) 50 + ) { 51 + data.resetSalt(msg.guild); 52 + msg.channel.send( 53 + `Successfully reset all salt on **${msg.guild.name}**!`, 54 + ); 55 + } 56 + return; 57 + } 58 + msg.reply('you need to mention a user you want to use this on!'); 59 + return; 60 + } 61 + let mem: GuildMember; 62 + switch (command) { 63 + case 'add': 64 + mem = await msg.guild.members.fetch(uid); 65 + if (!mem) { 66 + msg.reply("the user with this ID doesn't exist on this guild."); 67 + return; 68 + } 69 + if (mem.user.bot) { 70 + msg.reply("you can't report bots!"); 71 + return; 72 + } 73 + await data.saltUpAdmin(uid, msg.author.id, msg.guild); 74 + msg.channel.send( 75 + `Successfully reported ${mem} for being a salty bitch!`, 76 + ); 77 + break; 78 + case 'rem': 79 + mem = await msg.guild.members.fetch(uid); 80 + if (!mem) { 81 + msg.reply("the user with this ID doesn't exist on this guild."); 82 + return; 83 + } 84 + if (mem.user.bot) { 85 + msg.reply('bots are never salty!'); 86 + return; 87 + } 88 + if (await data.remOldestSalt(uid, msg.guild)) { 89 + msg.channel.send( 90 + `Successfully removed the oldest salt from ${mem}!`, 91 + ); 92 + } else { 93 + msg.channel.send(`${mem} has no salt that could be removed!`); 94 + } 95 + break; 96 + case 'clr': 97 + mem = await msg.guild.members.fetch(uid); 98 + if (!mem) { 99 + msg.reply("the user with this ID doesn't exist on this guild."); 100 + return; 101 + } 102 + if (mem.user.bot) { 103 + msg.reply('bots are never salty!'); 104 + return; 105 + } 106 + await data.clrSalt(uid, msg.guild); 107 + msg.channel.send(`Successfully cleared all salt from ${mem}!`); 108 + break; 109 + default: 110 + msg.reply( 111 + `this command doesn't exist. Use \`${ 112 + PREFIXES[msg.guild.id] 113 + }:help salt\` to get more info.`, 114 + ); 115 + break; 116 + } 117 + } else { 118 + msg.reply('Commands are only available on guilds.'); 119 + } 120 + }, 121 + ehelp() { 122 + return printHelp(); 123 + }, 124 + perm: 'SEND_MESSAGES', 125 + admin: true, 126 + hide: false, 127 + category: commandCategories.util, 128 + };
+407
src/commands/@setup.ts
··· 1 + import { MessageEmbedOptions } from 'discord.js'; 2 + import { COLOR, PREFIXES } from '../shared_assets'; 3 + 4 + import data from '../db'; 5 + import { findMember, yesOrNo, findRole } from '../bamands'; 6 + import { commandCategories } from '../types/enums'; 7 + 8 + function printHelp() { 9 + const info: Array<{ name: string; value: string }> = []; 10 + 11 + info.push({ 12 + name: 'ban <@User>', 13 + value: 'Deactivate all functions of the bot for a user', 14 + }); 15 + info.push({ 16 + name: 'unban <@User>', 17 + value: 'Reactivate all functions of the bot for a user', 18 + }); 19 + info.push({ 20 + name: 'join', 21 + value: "(De)activate joinsounds for the voicechannel you're connected to", 22 + }); 23 + info.push({ 24 + name: 'admin <@Role>', 25 + value: '(Un)set a role to be considered admin by the bot', 26 + }); 27 + info.push({ 28 + name: 'command', 29 + value: 30 + "(De)activate bot commands for the text channel you're sending this in", 31 + }); 32 + info.push({ 33 + name: 'notification', 34 + value: '(Un)set a textchannel to be notification channel', 35 + }); 36 + info.push({ 37 + name: 'info', 38 + value: 'Displays current settings', 39 + }); 40 + info.push({ 41 + name: 'prefix <prefix>', 42 + value: 'Set a custom character or string as prefix', 43 + }); 44 + 45 + return info; 46 + } 47 + 48 + export const setup: magibotCommand = { 49 + dev: false, 50 + name: 'setup', 51 + main: async function main(content, msg) { 52 + const args = msg.content.split(/ +/); 53 + const command = args[0].toLowerCase(); 54 + 55 + const mention = args[1]; 56 + 57 + // Create variables to use in cases 58 + let uid; 59 + let de; 60 + switch (command) { 61 + case 'ban': 62 + uid = await findMember(msg.guild!, mention); 63 + if (mention && uid) { 64 + if ( 65 + await yesOrNo( 66 + msg, 67 + `Do you really want to ban <@!${uid}> from using the bot?`, 68 + 'Successfully canceled ban.', 69 + ) 70 + ) { 71 + data.setBlacklistedUser(msg.guild!.id, uid, true); 72 + msg.channel.send( 73 + `Successfully banned <@!${uid}> from using the bot.`, 74 + ); 75 + } 76 + } else { 77 + msg.reply('you need to mention a user you want to use this on!'); 78 + } 79 + break; 80 + case 'unban': 81 + uid = await findMember(msg.guild!, mention); 82 + if (mention && uid) { 83 + if ( 84 + await yesOrNo( 85 + msg, 86 + `Do you really want to reactivate bot usage for <@!${uid}>?`, 87 + 'Successfully canceled unban.', 88 + ) 89 + ) { 90 + data.setBlacklistedUser(msg.guild!.id, uid, false); 91 + msg.channel.send( 92 + `Successfully banned <@!${uid}> from using the bot.`, 93 + ); 94 + } 95 + } else { 96 + msg.reply('you need to mention a user you want to use this on!'); 97 + } 98 + break; 99 + case 'join': 100 + // eslint-disable-next-line no-case-declarations 101 + const voiceChannel = msg.member?.voice.channel; 102 + 103 + if (voiceChannel) { 104 + const isJoinable = await data.isJoinable( 105 + msg.guild!.id, 106 + voiceChannel.id, 107 + ); 108 + de = ''; 109 + if (isJoinable) { 110 + de = 'de'; 111 + } 112 + if ( 113 + await yesOrNo( 114 + msg, 115 + `Do you want to ${de}activate joinsounds in **${voiceChannel.name}**?`, 116 + `Cancelled ${de}activating joinsounds in **${voiceChannel.name}**.`, 117 + ) 118 + ) { 119 + await data.setJoinable(msg.guild!.id, voiceChannel.id, !isJoinable); 120 + msg.channel.send( 121 + `Successfully ${de}activated joinsounds in **${voiceChannel.name}**.`, 122 + ); 123 + } 124 + } else { 125 + msg.channel.send("You're connected to no voice channel!"); 126 + } 127 + break; 128 + case 'admin': 129 + // eslint-disable-next-line no-case-declarations 130 + const rid = await findRole(msg.guild!, mention); 131 + if (mention && rid) { 132 + if (!(await data.isAdminRole(msg.guild!.id, rid))) { 133 + if ( 134 + await yesOrNo( 135 + msg, 136 + `Do you want to set <@&${rid}> as admin role?`, 137 + `Cancelled setting <@&${rid}> as admin role`, 138 + ) 139 + ) { 140 + await data.setAdmin(msg.guild!.id, rid, true); 141 + msg.channel.send(`Successfully set <@&${rid}> as admin role!`); 142 + } 143 + } else if ( 144 + await yesOrNo( 145 + msg, 146 + `Do you want to remove <@&${rid}> from the admin roles?`, 147 + `Cancelled removing <@&${rid}> from the admin roles`, 148 + ) 149 + ) { 150 + await data.setAdmin(msg.guild!.id, rid, false); 151 + msg.channel.send( 152 + `Successfully removed <@&${rid}> from the admin roles!`, 153 + ); 154 + } 155 + } else { 156 + msg.channel.send('You need to mention a role!'); 157 + } 158 + break; 159 + case 'command': 160 + // eslint-disable-next-line no-case-declarations 161 + const isCommandChannel = await data.isCommandChannel( 162 + msg.guild!.id, 163 + msg.channel.id, 164 + ); 165 + de = ''; 166 + if (isCommandChannel) { 167 + de = 'de'; 168 + } 169 + if ( 170 + await yesOrNo( 171 + msg, 172 + `Do you want to ${de}activate commands in <#${msg.channel.id}>?`, 173 + `Cancelled ${de}activating commands in <#${msg.channel.id}>`, 174 + ) 175 + ) { 176 + await data.setCommandChannel( 177 + msg.guild!.id, 178 + msg.channel.id, 179 + !isCommandChannel, 180 + ); 181 + msg.channel.send( 182 + `Successfully ${de}activated commands in <#${msg.channel.id}>.`, 183 + ); 184 + } 185 + break; 186 + case 'notification': 187 + // eslint-disable-next-line no-case-declarations 188 + const isNotChann = await data.isNotChannel( 189 + msg.guild!.id, 190 + msg.channel.id, 191 + ); 192 + if (!isNotChann) { 193 + if ( 194 + await yesOrNo( 195 + msg, 196 + `Do you want to activate MagiBot notifications in <#${msg.channel.id}>?`, 197 + `Cancelled activating notifications in <#${msg.channel.id}>`, 198 + ) 199 + ) { 200 + await data.setNotification(msg.guild!.id, msg.channel.id); 201 + msg.channel 202 + .send( 203 + `Successfully activated notifications in <#${msg.channel.id}>.`, 204 + ) 205 + .then((mess) => { 206 + mess.delete({ timeout: 5000 }).catch(() => {}); 207 + msg.delete(); 208 + }); 209 + } 210 + } else if ( 211 + await yesOrNo( 212 + msg, 213 + `Do you want to deactivate MagiBot notifications in <#${msg.channel.id}>?`, 214 + `Cancelled deactivating notifications in <#${msg.channel.id}>`, 215 + ) 216 + ) { 217 + await data.setNotification(msg.guild!.id, false); 218 + msg.channel.send('Successfully deactivated notifications.'); 219 + } 220 + break; 221 + case 'prefix': 222 + if (mention) { 223 + if ( 224 + await yesOrNo( 225 + msg, 226 + `Do you want to change the prefix in ${msg.guild!.name} from \`${ 227 + PREFIXES[msg.guild!.id] 228 + }.\` to \`${mention}.\` ?`, 229 + 'Cancelled changing the prefix.', 230 + ) 231 + ) { 232 + const newpref = await data.setPrefixE(msg.guild!.id, mention); 233 + if (newpref) { 234 + msg.channel.send( 235 + `Successfully changed prefix to \`${newpref}.\` !`, 236 + ); 237 + } else { 238 + msg.channel.send('Something bad happened...'); 239 + } 240 + } 241 + } else { 242 + msg.reply('you need to provide a prefix you want to use.'); 243 + } 244 + break; 245 + case 'info': 246 + /* eslint-disable no-case-declarations */ 247 + const info: Array<{ 248 + name: string; 249 + value: string; 250 + inline: boolean; 251 + }> = []; 252 + const set = await data.getSettings(msg.guild!.id); 253 + 254 + info.push({ 255 + name: 'Prefix', 256 + value: `${await data.getPrefixE(msg.guild!.id)}.`, 257 + inline: false, 258 + }); 259 + 260 + let str = ''; 261 + let cmd = set.commandChannels; 262 + /* eslint-enable no-case-declarations */ 263 + 264 + if (!cmd.toString()) { 265 + str = 'no whitelist, so every channel is allowed'; 266 + } else { 267 + cmd.forEach((com) => { 268 + str += `<#${com}> `; 269 + }); 270 + } 271 + info.push({ 272 + name: 'Command channels', 273 + value: str, 274 + inline: false, 275 + }); 276 + 277 + str = ''; 278 + cmd = set.adminRoles; 279 + if (!cmd.toString()) { 280 + str = 'Empty'; 281 + } else { 282 + cmd.forEach((com) => { 283 + str += `<@&${com}> `; 284 + }); 285 + } 286 + info.push({ 287 + name: 'Admin roles', 288 + value: str, 289 + inline: false, 290 + }); 291 + 292 + str = ''; 293 + cmd = set.joinChannels; 294 + if (!cmd.toString()) { 295 + str = 'Empty'; 296 + } else { 297 + const { guild } = msg; 298 + cmd.forEach((com) => { 299 + const chann = guild!.channels.cache.get(com); 300 + if (chann) { 301 + str += `${chann.name}, `; 302 + } else { 303 + data.setJoinable(guild!.id, com, false); 304 + } 305 + }); 306 + str = str.substring(0, str.length - 2); 307 + } 308 + info.push({ 309 + name: 'Joinsound channels', 310 + value: str, 311 + inline: false, 312 + }); 313 + 314 + str = ''; 315 + cmd = set.blacklistedUsers; 316 + if (!cmd.toString()) { 317 + str = 'Empty'; 318 + } else { 319 + cmd.forEach((com) => { 320 + str += `<@!${com}>, `; 321 + }); 322 + str = str.substring(0, str.length - 2); 323 + } 324 + info.push({ 325 + name: 'Blacklisted users', 326 + value: str, 327 + inline: false, 328 + }); 329 + 330 + str = ''; 331 + cmd = set.blacklistedEveryone; 332 + if (!cmd.toString()) { 333 + str = 'Empty'; 334 + } else { 335 + cmd.forEach((com) => { 336 + str += `<#${com}>, `; 337 + }); 338 + str = str.substring(0, str.length - 2); 339 + } 340 + info.push({ 341 + name: 'Channel with @everyone blacklist', 342 + value: str, 343 + inline: false, 344 + }); 345 + 346 + if (!set.saltKing) { 347 + str = 'None'; 348 + } else { 349 + str = `<@${set.saltKing}>`; 350 + } 351 + info.push({ 352 + name: 'SaltKing', 353 + value: str, 354 + inline: false, 355 + }); 356 + if (!set.saltRole) { 357 + str = 'None'; 358 + } else { 359 + str = `<@&${set.saltRole}>`; 360 + } 361 + info.push({ 362 + name: 'SaltKing role', 363 + value: str, 364 + inline: false, 365 + }); 366 + if (!set.notChannel) { 367 + str = 'None'; 368 + } else { 369 + str = `<#${set.notChannel}>`; 370 + } 371 + info.push({ 372 + name: 'Notification channel', 373 + value: str, 374 + inline: false, 375 + }); 376 + /* eslint-disable no-case-declarations */ 377 + /* eslint-disable camelcase */ 378 + const embed: MessageEmbedOptions = { 379 + color: COLOR, 380 + description: `Guild settings of ${msg.guild!.name}:`, 381 + fields: info, 382 + footer: { 383 + iconURL: msg.guild!.iconURL() || '', 384 + text: msg.guild!.name, 385 + }, 386 + }; 387 + /* eslint-enable no-case-declarations */ 388 + /* eslint-enable camelcase */ 389 + msg.channel.send('', { embed }); 390 + break; 391 + default: 392 + msg.reply( 393 + `this command doesn't exist. Use \`${ 394 + PREFIXES[msg.guild!.id] 395 + }:help setup\` for more info.`, 396 + ); 397 + break; 398 + } 399 + }, 400 + ehelp() { 401 + return printHelp(); 402 + }, 403 + perm: 'SEND_MESSAGES', 404 + admin: true, 405 + hide: false, 406 + category: commandCategories.util, 407 + };
+56
src/commands/@sound.ts
··· 1 + import { PREFIXES } from '../shared_assets'; 2 + import data from '../db'; 3 + import { commandCategories } from '../types/enums'; 4 + import { findMember } from '../bamands'; 5 + 6 + function printHelp() { 7 + const info: Array<{ name: string; value: string }> = []; 8 + 9 + info.push({ 10 + name: 'rem <@User|userid|nickname>', 11 + value: 12 + 'Remove the joinsound of a user. If you use nickname it has to be at least three characters long', 13 + }); 14 + 15 + return info; 16 + } 17 + 18 + export const sound: magibotCommand = { 19 + name: 'sound', 20 + dev: false, 21 + main: async function main(content, msg) { 22 + const args = msg.content.split(/ +/); 23 + const command = args[0].toLowerCase(); 24 + const mention = args[1]; 25 + switch (command) { 26 + case 'rem': 27 + /* eslint-disable no-case-declarations */ 28 + const uid = await findMember(msg.guild!, mention); 29 + /* eslint-enable no-case-declarations */ 30 + if (mention && uid) { 31 + if (await data.addSound(uid, false, msg.guild!.id)) { 32 + msg.reply(`you successfully removed <@!${uid}>s joinsound!`); 33 + } else { 34 + msg.reply('Aaaaaand you failed.'); 35 + } 36 + } else { 37 + msg.reply('you need to mention a user you want to use this on!'); 38 + } 39 + break; 40 + default: 41 + msg.reply( 42 + `this command doesn't exist. Use \`${ 43 + PREFIXES[msg.guild!.id] 44 + }:help sound\` for more info.`, 45 + ); 46 + break; 47 + } 48 + }, 49 + ehelp() { 50 + return printHelp(); 51 + }, 52 + perm: 'SEND_MESSAGES', 53 + admin: true, 54 + hide: false, 55 + category: commandCategories.util, 56 + };
+32
src/commands/@update.ts
··· 1 + import { commandCategories } from '../types/enums'; 2 + import { bot } from '../bot'; 3 + import data from '../db'; 4 + 5 + export const update: magibotCommand = { 6 + ehelp: () => [], 7 + perm: ['ADMINISTRATOR'], 8 + name: 'update', 9 + main: async function main(content, msg) { 10 + await msg.channel 11 + .send(`Do you want to send the update\n${msg.content}`) 12 + .then((mess) => { 13 + const filter = (reaction, user) => (reaction.emoji.name === '☑' || reaction.emoji.name === '❌') 14 + && user.id === msg.author.id; 15 + mess.react('☑'); 16 + mess.react('❌'); 17 + mess.awaitReactions(filter, { max: 1, time: 60000 }).then((reacts) => { 18 + mess.delete(); 19 + if (reacts.first() && reacts.first()?.emoji.name === '☑') { 20 + data.sendUpdate(msg.content, bot); 21 + msg.channel.send(`Successfully sent:\n${msg.content}`); 22 + } else if (reacts.first()) { 23 + msg.channel.send('successfully canceled update'); 24 + } 25 + }); 26 + }); 27 + }, 28 + admin: true, 29 + hide: true, 30 + dev: true, 31 + category: commandCategories.util, 32 + };
+61
src/commands/bug.ts
··· 1 + import { TextChannel } from 'discord.js'; 2 + import { bot } from '../bot'; 3 + import { PREFIXES } from '../shared_assets'; 4 + import { commandCategories } from '../types/enums'; 5 + 6 + export const bug: magibotCommand = { 7 + name: 'bug', 8 + async main(content, msg) { 9 + if (!(msg.content.length > 0)) { 10 + msg.reply( 11 + `you need to add info about the report after the command. Use \`${ 12 + PREFIXES[msg.guild!.id] 13 + }.help bug\` to get more info.`, 14 + ); 15 + return; 16 + } 17 + msg.channel 18 + .send(`Do you want to send this bugreport?\n${msg.content}`) 19 + .then((mess) => { 20 + const filter = (reaction, user) => (reaction.emoji.name === '☑' || reaction.emoji.name === '❌') 21 + && user.id === msg.author.id; 22 + mess.react('☑'); 23 + mess.react('❌'); 24 + mess 25 + .awaitReactions(filter, { max: 1, time: 20000 }) 26 + .then(async (reacts) => { 27 + mess.delete(); 28 + if (reacts.first() && reacts.first()?.emoji.name === '☑') { 29 + const chann = await bot.channels.fetch('444529194949672972'); 30 + (chann as TextChannel) 31 + .send( 32 + `**Bugreport** by ${msg.author.username} (<@${ 33 + msg.author.id 34 + }>) on server ${msg.guild!.name}( ${msg.guild!.id} ) :\n${ 35 + msg.content 36 + }`, 37 + ) 38 + .then(() => { 39 + msg.channel.send('Succesfully sent bugreport.'); 40 + }); 41 + } else if (reacts.first()) { 42 + msg.channel.send('Successfully canceled bugreport.'); 43 + } 44 + }); 45 + }); 46 + }, 47 + admin: false, 48 + ehelp() { 49 + return [ 50 + { 51 + name: 52 + '<bugreport with information about what you did, what was expected, and what went wrong>', 53 + value: 'Report a bug concerning MagiBot', 54 + }, 55 + ]; 56 + }, 57 + perm: 'SEND_MESSAGES', 58 + hide: false, 59 + dev: false, 60 + category: commandCategories.misc, 61 + };
+220
src/commands/help.ts
··· 1 + import { MessageEmbedOptions } from 'discord.js'; 2 + import { PREFIXES, COLOR, user } from '../shared_assets'; 3 + import { commandCategories } from '../types/enums'; 4 + // we allow this cycle once, as the help command also needs to list itself 5 + import { commands } from '../commandHandler'; // eslint-disable-line import/no-cycle 6 + import data from '../db'; 7 + 8 + export const help: magibotCommand = { 9 + name: 'help', 10 + category: commandCategories.misc, 11 + admin: false, 12 + perm: 'SEND_MESSAGES', 13 + main: async function main(content, msg) { 14 + if (!msg.guild) { 15 + return; 16 + } 17 + const args = content.split(/ +/); 18 + let command = args[0].toLowerCase(); 19 + // extended help 20 + if (command) { 21 + const acommand = `@${command}`; 22 + if (!(commands[command] || commands[acommand])) { 23 + msg.reply( 24 + `this command does not exist. Use \`${ 25 + PREFIXES[msg.guild.id] 26 + }.help\` to get a full list of the commands available.`, 27 + ); 28 + } else if (commands[command]) { 29 + if (commands[command].ehelp) { 30 + const info: Array<{ 31 + name: string; 32 + value: string; 33 + inline: boolean; 34 + }> = []; 35 + let ehelps = commands[command].ehelp(msg); 36 + ehelps.forEach((ehelp) => { 37 + if (msg.guild) { 38 + info.push({ 39 + name: `${PREFIXES[msg.guild.id]}.${command} ${ehelp.name}`, 40 + value: ehelp.value, 41 + inline: false, 42 + }); 43 + } 44 + }); 45 + let embed: MessageEmbedOptions = { 46 + color: COLOR, 47 + description: `Commands available via the prefix \`${ 48 + PREFIXES[msg.guild.id] 49 + }.${command}\`:`, 50 + fields: info, 51 + footer: { 52 + iconURL: user().avatarURL() || '', 53 + text: 54 + '<required input> , [optional input] , choose|one|of|these , (comment on the command)', 55 + }, 56 + }; 57 + msg.channel.send('', { embed }); 58 + // admin variant? 59 + if (msg.member && (await data.isAdmin(msg.guild.id, msg.member))) { 60 + if (commands[acommand] && commands[acommand].ehelp) { 61 + const inf: Array<{ 62 + name: string; 63 + value: string; 64 + inline: boolean; 65 + }> = []; 66 + ehelps = commands[acommand].ehelp(msg); 67 + ehelps.forEach((ehelp) => { 68 + if (msg.guild) { 69 + inf.push({ 70 + name: `${PREFIXES[msg.guild.id]}:${acommand.slice(1)} ${ 71 + ehelp.name 72 + }`, 73 + value: ehelp.value, 74 + inline: false, 75 + }); 76 + } 77 + }); 78 + embed = { 79 + color: COLOR, 80 + description: `Admin commands available via the prefix \`${ 81 + PREFIXES[msg.guild.id] 82 + }:${command}\`:`, 83 + fields: inf, 84 + footer: { 85 + iconURL: user().avatarURL() || '', 86 + text: 87 + '<required input> , [optional input] , choose|one|of|these , (comment on the command)', 88 + }, 89 + }; 90 + msg.channel.send('', { embed }); 91 + } 92 + } 93 + } else { 94 + msg.reply('there is no extended help available for this command.'); 95 + } 96 + } else if (msg.member && (await data.isAdmin(msg.guild.id, msg.member))) { 97 + // Only Admin command 98 + command = acommand; 99 + if (commands[command].ehelp) { 100 + const inf: Array<{ 101 + name: string; 102 + value: string; 103 + inline: boolean; 104 + }> = []; 105 + const ehelps = commands[command].ehelp(msg); 106 + ehelps.forEach((ehelp) => { 107 + if (msg.guild) { 108 + inf.push({ 109 + name: `${PREFIXES[msg.guild.id]}:${command.slice(1)} ${ 110 + ehelp.name 111 + }`, 112 + value: ehelp.value, 113 + inline: false, 114 + }); 115 + } 116 + }); 117 + const embed: MessageEmbedOptions = { 118 + color: COLOR, 119 + description: `Admin commands available via the prefix \`${ 120 + PREFIXES[msg.guild.id] 121 + }:${command.slice(1)}\`:`, 122 + fields: inf, 123 + footer: { 124 + iconURL: user().avatarURL() || '', 125 + text: 126 + '<required input> , [optional input] , choose|one|of|these , (comment on the command)', 127 + }, 128 + }; 129 + 130 + msg.channel.send('', { embed }); 131 + } else { 132 + msg.reply('there is no extended help available for this command.'); 133 + } 134 + } 135 + } else { 136 + // normal help, sort by categories 137 + const cmds: Array<{ name: string; value: string; inline: boolean }> = []; 138 + Object.values(commandCategories).forEach((cat) => { 139 + let coms = ''; 140 + Object.values(commands).forEach((commnd) => { 141 + if (commnd.category === cat && !(commnd.hide || commnd.admin)) { 142 + let nm = commnd.name; 143 + if (commnd.dev) { 144 + nm += '(dev only)'; 145 + } 146 + coms += `${nm}, `; 147 + } 148 + }); 149 + if (coms !== '') { 150 + coms = coms.slice(0, -2); 151 + cmds.push({ 152 + name: `${cat} commands`, 153 + value: coms, 154 + inline: false, 155 + }); 156 + } 157 + }); 158 + let embed: MessageEmbedOptions = { 159 + color: COLOR, 160 + description: `Commands available via the prefix \`${ 161 + PREFIXES[msg.guild.id] 162 + }.\` :\nto get more info on a single command use \`${ 163 + PREFIXES[msg.guild.id] 164 + }.help <command>\``, 165 + fields: cmds, 166 + footer: { 167 + iconURL: user().avatarURL() || '', 168 + text: `admins can override commands with ${ 169 + PREFIXES[msg.guild.id] 170 + }: instead of ${ 171 + PREFIXES[msg.guild.id] 172 + }. to ignore command channel restrictions`, 173 + }, 174 + }; 175 + msg.channel.send('', { embed }); 176 + if (msg.member && (await data.isAdmin(msg.guild.id, msg.member))) { 177 + const cmd: Array<{ name: string; value: string; inline: boolean }> = []; 178 + let coms = ''; 179 + Object.values(commands).forEach((commnd) => { 180 + if (commnd.admin && !commnd.hide) { 181 + let nm = commnd.name; 182 + if (commnd.dev) { 183 + nm += '(dev only)'; 184 + } 185 + coms += `${nm}, `; 186 + } 187 + }); 188 + if (coms !== '') { 189 + coms = coms.slice(0, -2); 190 + cmd.push({ 191 + name: 'Admin commands', 192 + value: coms, 193 + inline: false, 194 + }); 195 + } 196 + embed = { 197 + color: COLOR, 198 + description: `Admin commands available via the prefix \`${ 199 + PREFIXES[msg.guild.id] 200 + }:\` :\nto get more info on a single command use \`${ 201 + PREFIXES[msg.guild.id] 202 + }.help <command>\``, 203 + fields: cmd, 204 + footer: { 205 + iconURL: user().avatarURL() || '', 206 + text: `admins can override commands with ${ 207 + PREFIXES[msg.guild.id] 208 + }: instead of ${ 209 + PREFIXES[msg.guild.id] 210 + }. to ignore command channel restrictions`, 211 + }, 212 + }; 213 + msg.channel.send('', { embed }); 214 + } 215 + } 216 + }, 217 + hide: false, 218 + dev: false, 219 + ehelp: () => [], 220 + };
+55
src/commands/info.ts
··· 1 + import { MessageEmbedOptions } from 'discord.js'; 2 + import { 3 + PREFIXES, COLOR, user, SIGN, 4 + } from '../shared_assets'; 5 + 6 + import { commandCategories } from '../types/enums'; 7 + 8 + export const inf: magibotCommand = { 9 + dev: false, 10 + name: 'info', 11 + main: (content, msg) => { 12 + const info: Array<{ 13 + name: string; 14 + value: string; 15 + inline: boolean; 16 + }> = []; 17 + 18 + info.push({ 19 + name: 'Links', 20 + value: '[Invite me to your guild](https://discordapp.com/oauth2/authorize?client_id=384820232583249921&permissions=8&redirect_uri=https%3A%2F%2Fdiscord.gg%2F2Evcf4T&scope=bot)\n[Official support Discord](https://discord.gg/2Evcf4T)', 21 + inline: false, 22 + }); 23 + 24 + info.push({ 25 + name: 'How to support MagiBot', 26 + value: `Donate a buck via [Paypal](https://paypal.me/pools/c/8be5ok31vB)\nPledge on [MagiBots Patreon](https://www.patreon.com/MagiBot)\nVote on [discordbots.org](https://discordbots.org/bot/384820232583249921) and [bots.ondiscord.xyz](https://bots.ondiscord.xyz/bots/384820232583249921)!\n(daily vote reminder via *${PREFIXES[msg.guild!.id]}.dbl*)`, 27 + inline: false, 28 + }); 29 + 30 + info.push({ 31 + name: 'A bit of background', 32 + value: "MagiBot is being developed in Germany by T0TProduction#0001 as a hobby project.\nIt was originally a private bot for a Discord guild themed after the Pokemon Magikarp which is the reason it's called MagiBot.", 33 + inline: false, 34 + }); 35 + 36 + const embed:MessageEmbedOptions = { 37 + color: COLOR, 38 + description: 'Some information about the bot:', 39 + fields: info, 40 + footer: { 41 + iconURL: user().avatarURL() || '', 42 + text: SIGN, 43 + }, 44 + }; 45 + 46 + msg.channel.send({ embed }); 47 + }, 48 + ehelp() { 49 + return [{ name: '', value: 'Get some info about the bot as well as links to official MagiBot stuff.' }]; 50 + }, 51 + perm: 'SEND_MESSAGES', 52 + admin: false, 53 + hide: false, 54 + category: commandCategories.misc, 55 + };
+22
src/commands/invite.ts
··· 1 + import { TextChannel } from 'discord.js'; 2 + import { commandCategories } from '../types/enums'; 3 + 4 + export const inv: magibotCommand = { 5 + name: 'invite', 6 + hide: false, 7 + dev: false, 8 + async main(bot, msg) { 9 + // TODO check if invite activated on server 10 + // TODO let user define invite length 11 + const invite = await (msg.channel as TextChannel).createInvite( 12 + { reason: `member ${msg.author} used invite command` }, 13 + ); 14 + msg.channel.send(`Here's an invite link to this channel: ${invite}`); 15 + }, 16 + ehelp() { 17 + return [{ name: '', value: 'Create and get an invite link to the guild.' }]; 18 + }, 19 + perm: ['SEND_MESSAGES', 'CREATE_INSTANT_INVITE'], 20 + admin: false, 21 + category: commandCategories.util, 22 + };
+21
src/commands/ping.ts
··· 1 + import { commandCategories } from '../types/enums'; 2 + 3 + export const ping: magibotCommand = { 4 + name: 'ping', 5 + dev: false, 6 + hide: false, 7 + main(bot, msg) { 8 + const start = Date.now(); 9 + msg.channel.send('Pong!').then((newMsg) => { 10 + const stop = Date.now(); 11 + const diff = stop - start; 12 + newMsg.edit(`Pong! \nReactiontime: \`(${diff}ms)\``); 13 + }); 14 + }, 15 + ehelp() { 16 + return [{ name: '', value: 'Ping the bot and get the response time.' }]; 17 + }, 18 + perm: 'SEND_MESSAGES', 19 + admin: false, 20 + category: commandCategories.misc, 21 + };
+67
src/commands/profile.ts
··· 1 + import { MessageEmbedOptions } from 'discord.js'; 2 + import { commandCategories } from '../types/enums'; 3 + import { PREFIXES } from '../shared_assets'; 4 + import data from '../db'; 5 + import { findMember } from '../bamands'; 6 + 7 + export const profile: magibotCommand = { 8 + name: 'profile', 9 + dev: false, 10 + main: async function main(bot, msg) { 11 + if (msg.guild) { 12 + const args = msg.content.split(/ +/); 13 + const mention = args[0]; 14 + let id = await findMember(msg.guild, mention); 15 + if (!id && !mention) { 16 + id = msg.author.id; 17 + } else if (!id) { 18 + msg.reply(` you need to define the user uniquely or not mention any user. For more help use \`${PREFIXES[msg.guild.id]}.help profile\``); 19 + return; 20 + } 21 + const info: Array<{ 22 + name: string; 23 + value: string; 24 + inline: boolean; 25 + }> = []; 26 + const salt = await data.getSalt(id, msg.guild.id); 27 + const usage = await data.getUsage(id, msg.guild.id); 28 + info.push({ 29 + name: 'Saltlevel', 30 + value: salt, 31 + inline: false, 32 + }); 33 + info.push({ 34 + name: 'Bot usage', 35 + value: String(usage), 36 + inline: false, 37 + }); 38 + const link = await data.getSound(id, msg.guild.id); 39 + info.push({ 40 + name: 'Joinsound', 41 + value: link, 42 + inline: false, 43 + }); 44 + const user = await msg.guild.members.fetch(id); 45 + const embed:MessageEmbedOptions = { 46 + color: user.displayColor, 47 + description: `Here's some info on ${user.displayName}`, 48 + fields: info, 49 + thumbnail: { url: user.user.avatarURL() || '' }, 50 + footer: { 51 + iconURL: user.user.avatarURL() || '', 52 + text: user.user.tag, 53 + }, 54 + }; 55 + msg.channel.send('', { embed }); 56 + } else { 57 + msg.reply('This command is only available in guilds.'); 58 + } 59 + }, 60 + ehelp() { 61 + return [{ name: '', value: 'Get info about yourself.' }, { name: '<@user|userid|nickname>', value: 'Get info about a certain user. If you use the nickname you need to at least define three characters.' }]; 62 + }, 63 + perm: 'SEND_MESSAGES', 64 + admin: false, 65 + hide: false, 66 + category: commandCategories.util, 67 + };
+43
src/commands/rfact.ts
··· 1 + import axios from 'axios'; 2 + import { commandCategories } from '../types/enums'; 3 + import { COLOR, user } from '../shared_assets'; 4 + 5 + 6 + const options = { weekday: 'long', month: 'long', day: 'numeric' }; 7 + 8 + export const rfact: magibotCommand = { 9 + main: async (content, msg) => { 10 + const now = new Date(); 11 + let fact = await axios.get(`http://numbersapi.com/${now.getMonth() + 1}/${now.getDate()}/date`); 12 + fact = fact.data; 13 + 14 + 15 + if (!fact) { 16 + msg.channel.send('Something went wrong whilst contacting the API...'); 17 + return; 18 + } 19 + const embed = { 20 + color: COLOR, 21 + // fields: info, 22 + title: `Random fact about: \`${now.toLocaleDateString('en-US', options)}\``, 23 + description: fact, 24 + footer: { 25 + /* eslint-disable camelcase */ 26 + icon_url: user().avatarURL, 27 + /* eslint-enable camelcase */ 28 + text: 'powered by numbersapi.com', 29 + }, 30 + }; 31 + 32 + msg.channel.send({ embed }); 33 + }, 34 + ehelp() { 35 + return [{ name: '', value: 'Get a random fact about the current date.' }]; 36 + }, 37 + name: 'rfact', 38 + dev: false, 39 + perm: 'SEND_MESSAGES', 40 + admin: false, 41 + hide: false, 42 + category: commandCategories.fun, 43 + };
+116
src/commands/roll.ts
··· 1 + import { COLOR, PREFIXES } from '../shared_assets'; 2 + import { commandCategories } from '../types/enums'; 3 + 4 + /** definition of calculation of dice, use parse(input) 5 + returns array of throws with last index being sum, 6 + second last being multiplier and third last being add 7 + */ 8 + function comp(s, mI, nI, fI, aI) { 9 + const m = parseInt(mI, 10) || 1; 10 + const n = parseInt(nI, 10) || 1; 11 + const f = parseInt(fI, 10); 12 + if (!f) { 13 + return false; 14 + } 15 + const a = typeof aI === 'string' ? parseInt(aI.replace(/\s/g, ''), 10) || 0 : 0; 16 + 17 + const ret: Array<number | boolean> = []; 18 + let r = 0; 19 + let overload = false; 20 + for (let i = 0; i < n; i++) { 21 + if (i > 23) { 22 + overload = true; 23 + break; 24 + } 25 + const tmp = Math.floor(Math.random() * f) + 1; 26 + ret.push(tmp); 27 + r += tmp; 28 + } 29 + ret.push(overload); 30 + ret.push(m); 31 + ret.push(n); 32 + ret.push(f); 33 + ret.push(a); 34 + ret.push(r * m + a); 35 + 36 + return ret; 37 + } 38 + function parse(de:string) { 39 + // eslint-disable-next-line prefer-spread 40 + return comp.apply( 41 + null, 42 + de.match(/(?:(\d+)\s*\*\s*)?(\d*)d(\d+)(?:\s*([+-]\s*\d+))?/i) as any, 43 + ); 44 + } 45 + 46 + export const roll: magibotCommand = { 47 + name: 'roll', 48 + hide: false, 49 + dev: false, 50 + main(bot, msg) { 51 + const args = msg.content.split(/ +/); 52 + const input = args[0]; 53 + 54 + const throws = parse(input); 55 + if (!throws) { 56 + msg.channel.send( 57 + `Your inputs could not be interpreted. Use \`${ 58 + PREFIXES[msg.guild!.id] 59 + }.help roll\` for more info.`, 60 + ); 61 + return; 62 + } 63 + const info: Array<{ 64 + name: string; 65 + value: string; 66 + inline: boolean; 67 + }> = []; 68 + const size = throws.length; 69 + if (throws[size - 6]) { 70 + msg.reply('the dungeon master can only roll 24 dice at a time!'); 71 + } 72 + let thro = throws[size - 4]; 73 + if (thro > 24) { 74 + thro = 24; 75 + } 76 + info.push({ 77 + name: `Sum of ${throws[size - 5]} * ${thro}d${throws[size - 3]} + ${ 78 + throws[size - 2] 79 + }`, 80 + value: String(throws[size - 1]), 81 + inline: false, 82 + }); 83 + for (let i = 0; i < size - 6; i++) { 84 + info.push({ 85 + name: `${i + 1}. roll`, 86 + value: String(throws[i]), 87 + inline: true, 88 + }); 89 + } 90 + const embed = { 91 + color: COLOR, 92 + description: `:game_die: <@!${msg.author.id}>s dice have been rolled:`, 93 + fields: info, 94 + footer: { 95 + /* eslint-disable camelcase */ 96 + icon_url: 97 + 'https://cdn0.iconfinder.com/data/icons/video-game-items-concepts-line-art/128/dd-dice-512.png', 98 + /* eslint-enable camelcase */ 99 + text: 'The real dungeon master', 100 + }, 101 + }; 102 + msg.channel.send('', { embed }); 103 + }, 104 + ehelp() { 105 + const ret: Array<{ name: string; value: string }> = []; 106 + ret.push({ 107 + name: '[multiplier]*[number of rolls]d<die number>[+ <modifier>]', 108 + value: 109 + 'Roll dice with standard DnD syntax.\nExamples:\n`5*2d6+1`,`3d6 + 12`, `4*d12 + 3`, `d100`', 110 + }); 111 + return ret; 112 + }, 113 + perm: 'SEND_MESSAGES', 114 + admin: false, 115 + category: commandCategories.fun, 116 + };
+124
src/commands/salt.ts
··· 1 + import { Message, MessageEmbedOptions } from 'discord.js'; 2 + import data from '../db'; 3 + import * as cmds from '../bamands'; 4 + import { commandCategories } from '../types/enums'; 5 + import { PREFIXES } from '../shared_assets'; 6 + 7 + function printHelp(msg: Message) { 8 + const info: Array<{ name: string; value: string }> = []; 9 + info.push({ 10 + name: 'add <@user|userid|nickname>', 11 + value: 12 + 'Report a user being salty. If you use nickname it has to be at least three characters long and unique.\nThis has a 1h cooldown for reporting the same user.', 13 + }); 14 + info.push({ 15 + name: 'top', 16 + value: `Displays the top 5 salter in ${msg.guild?.name}`, 17 + }); 18 + return info; 19 + } 20 + 21 + export const salt: magibotCommand = { 22 + main: async function main(content: string, msg: Message) { 23 + const args = content.split(/ +/); 24 + const command = args[0].toLowerCase(); 25 + if (msg.guild) { 26 + switch (command) { 27 + case 'add': 28 + /* eslint-disable no-case-declarations */ 29 + const mention = args[1]; 30 + const uid = await cmds.findMember(msg.guild, mention); 31 + /* eslint-enable no-case-declarations */ 32 + if (mention && uid) { 33 + if (uid === msg.author.id) { 34 + msg.reply("you can't report yourself!"); 35 + return; 36 + } 37 + const mem = await msg.guild.members.fetch(uid).catch(() => {}); 38 + if (!mem) { 39 + msg.reply("the user with this ID doesn't exist on this guild."); 40 + return; 41 + } 42 + if (mem.user.bot) { 43 + msg.reply("you can't report bots!"); 44 + return; 45 + } 46 + const time = await data.saltUp(uid, msg.author.id, msg.guild); 47 + if (time === 0) { 48 + msg.channel.send( 49 + `Successfully reported ${mem} for being a salty bitch!`, 50 + ); 51 + } else { 52 + msg.reply( 53 + `you can report ${mem} again in ${59 54 + - Math.floor((time * 60) % 60)} min and ${60 55 + - Math.floor((time * 60 * 60) % 60)} sec!`, 56 + ); 57 + } 58 + } else { 59 + msg.reply('you need to mention a user you want to report!'); 60 + } 61 + break; 62 + case 'top': 63 + /* eslint-disable no-case-declarations */ 64 + const salters = await data.topSalt(msg.guild.id); 65 + const info: Array<{ 66 + name: string; 67 + value: string; 68 + inline: boolean; 69 + }> = []; 70 + /* eslint-enable no-case-declarations */ 71 + for (let i = 0; i < 5; i++) { 72 + let mname = 'User left guild'; 73 + if (salters[i]) { 74 + // eslint-disable-next-line no-await-in-loop 75 + const member = await msg.guild.members 76 + .fetch(salters[i].salter) 77 + .catch(() => {}); 78 + if (member) { 79 + mname = member.displayName; 80 + } 81 + info.push({ 82 + name: `${i + 1}. place: ${mname}`, 83 + value: `${salters[i].salt} salt`, 84 + inline: false, 85 + }); 86 + } else { 87 + break; 88 + } 89 + } 90 + /* eslint-disable no-case-declarations */ 91 + const embed: MessageEmbedOptions = { 92 + color: 0xffffff, 93 + description: `Top 5 salter in ${msg.guild.name}:`, 94 + fields: info, 95 + footer: { 96 + iconURL: msg.guild.iconURL() || '', 97 + text: msg.guild.name, 98 + }, 99 + }; 100 + /* eslint-enable no-case-declarations */ 101 + msg.channel.send('', { embed }); 102 + break; 103 + default: 104 + msg.reply( 105 + `this command doesn't exist. Use \`${ 106 + PREFIXES[msg.guild.id] 107 + }.help salt\` for more info.`, 108 + ); 109 + break; 110 + } 111 + } else { 112 + msg.reply('commands are only functional when used in a guild.'); 113 + } 114 + }, 115 + name: 'salt', 116 + ehelp(msg: Message) { 117 + return printHelp(msg); 118 + }, 119 + perm: 'SEND_MESSAGES', 120 + admin: false, 121 + hide: false, 122 + category: commandCategories.fun, 123 + dev: false, 124 + };
+82
src/commands/sound.ts
··· 1 + import ffprobe from 'ffprobe'; 2 + import ffprobeStatic from 'ffprobe-static'; 3 + import { PREFIXES } from '../shared_assets'; 4 + import data from '../db'; 5 + import { commandCategories } from '../types/enums'; 6 + 7 + 8 + function printHelp() { 9 + const info:Array<{name:string, value:string}> = []; 10 + 11 + info.push({ 12 + name: '<Link to audio file>', 13 + value: "Setup a joinsound for yourself. The link shouldn't link to a website, but directly to the file.\nOnly .mp3 and .wav are being supported at the moment.", 14 + }); 15 + 16 + info.push({ 17 + name: '(attach soundfile to this command)', 18 + value: 'Setup a joinsound for yourself. Only .mp3 and .wav are being supported at the moment.\nRemember to attach the sound file to the message you use this command in.', 19 + }); 20 + 21 + info.push({ 22 + name: 'rem', 23 + value: 'Remove your joinsound', 24 + }); 25 + 26 + return info; 27 + } 28 + 29 + export const sound: magibotCommand = { 30 + name: 'sound', 31 + main: async function main(content, msg) { 32 + if (!msg.guild) { 33 + return; 34 + } 35 + const args = content.split(/ +/); 36 + const command = args[0].toLowerCase(); 37 + if (command === 'rem') { 38 + if (await data.addSound(msg.author.id, false, msg.guild.id)) { 39 + msg.reply('you successfully removed your joinsound!'); 40 + } else { 41 + msg.reply('Aaaaaand you failed.'); 42 + } 43 + } else { 44 + let mention = args[0]; 45 + const file = msg.attachments.array()[0]; 46 + if (mention || file) { 47 + if (file) { 48 + mention = file.url; 49 + } 50 + 51 + let snd = await ffprobe(mention, { path: ffprobeStatic.path }).catch(() => { }); 52 + if (!snd) { 53 + msg.reply(`you need to use a compatible link or upload the file with the command! For more info use \`${PREFIXES[msg.guild.id]}.help sound\``); 54 + return; 55 + } 56 + // eslint-disable-next-line prefer-destructuring 57 + snd = snd.streams[0]; 58 + if (snd.codec_name !== 'mp3' && snd.codec_name !== 'pcm_s16le' && snd.codec_name !== 'pcm_f32le') { 59 + msg.reply(`you need to use a compatible file! For more info use \`${PREFIXES[msg.guild.id]}.help sound\``); 60 + return; 61 + } 62 + if (snd.duration > 8) { 63 + msg.reply("the joinsound you're trying to add is longer than 8 seconds."); 64 + return; 65 + } 66 + if (await data.addSound(msg.author.id, mention, msg.guild.id)) { 67 + msg.reply('you successfully changed your joinsound!'); 68 + } else { 69 + msg.reply('Something went wrong...'); 70 + } 71 + } else { 72 + msg.reply(`this is not a valid command. If you tried adding a sound, remember to attach the file to the command. Use \`${PREFIXES[msg.guild.id]}.help sound\` for more info.`); 73 + } 74 + } 75 + }, 76 + ehelp() { return printHelp(); }, 77 + admin: false, 78 + perm: 'SEND_MESSAGES', 79 + hide: false, 80 + category: commandCategories.fun, 81 + dev: false, 82 + };
+89
src/commands/stats.ts
··· 1 + import { MessageEmbedOptions } from 'discord.js'; 2 + import si from 'systeminformation'; 3 + import { commandCategories } from '../types/enums'; 4 + import { 5 + OWNERID, COLOR, SIGN, user, 6 + } from '../shared_assets'; 7 + // eslint-disable-next-line import/no-cycle 8 + import { bot } from '../bot'; 9 + 10 + export const stats: magibotCommand = { 11 + name: 'stats', 12 + main: async (content, msg) => { 13 + const info:Array<{name:string, value:string|number, inline:boolean}> = []; 14 + const guilds = bot.guilds.cache.array(); 15 + 16 + info.push({ 17 + name: 'Number of guilds currently being served', 18 + value: guilds.length, 19 + inline: false, 20 + }); 21 + info.push({ 22 + name: 'Number of users currently being served', 23 + value: bot.users.cache.size, 24 + inline: false, 25 + }); 26 + 27 + 28 + // uptime calc 29 + const u = bot.uptime || 0; 30 + let uptime = ''; 31 + // days 32 + let x = Math.floor(u / 3600000 / 24); 33 + if (x > 0) { 34 + uptime += `${x}d : `; 35 + } 36 + // hours 37 + x = Math.floor(u / 3600000) % 24; 38 + if (x > 0) { 39 + uptime += `${x}h : `; 40 + } 41 + // mins 42 + x = Math.floor(u / 60000) % 60; 43 + if (x > 0) { 44 + uptime += `${x}m : `; 45 + } 46 + // secs 47 + x = Math.floor(u / 1000) % 60; 48 + if (x > 0) { 49 + uptime += `${x}s`; 50 + } 51 + // enbettung in ausgabe 52 + info.push({ 53 + name: 'Time since last restart', 54 + value: uptime, 55 + inline: false, 56 + }); 57 + if (msg.author.id === OWNERID) { 58 + const memInfo = await si.mem(); 59 + const memUsedByProccess = process.memoryUsage().rss; 60 + info.push({ 61 + name: 'Memory usage:', 62 + value: `Memory used by this: ${Math.round(memUsedByProccess / 1048576)} MB (${Math.round((memUsedByProccess / memInfo.used) * 100)}% of used memory) 63 + Total available memory: ${Math.round(memInfo.total / 1048576)} MB 64 + Used memory: ${Math.round(memInfo.used / 1048576)} MB (${Math.round((memInfo.used / memInfo.total) * 100)}%)`, 65 + inline: false, 66 + }); 67 + } 68 + 69 + const embed :MessageEmbedOptions = { 70 + color: COLOR, 71 + description: 'Here are some stats:', 72 + fields: info, 73 + footer: { 74 + iconURL: user().avatarURL() || '', 75 + text: SIGN, 76 + }, 77 + }; 78 + 79 + msg.channel.send({ embed }); 80 + }, 81 + ehelp() { 82 + return [{ name: '', value: 'Get some stats from the bot.' }]; 83 + }, 84 + perm: 'SEND_MESSAGES', 85 + admin: false, 86 + hide: false, 87 + category: commandCategories.misc, 88 + dev: false, 89 + };
+223
src/commands/vote.ts
··· 1 + import data from '../db'; 2 + import { asyncForEach } from '../bamands'; 3 + import { commandCategories } from '../types/enums'; 4 + 5 + const reactions = [ 6 + '🇦', 7 + '🇧', 8 + '🇨', 9 + '🇩', 10 + '🇪', 11 + '🇫', 12 + '🇬', 13 + '🇭', 14 + '🇮', 15 + '🇯', 16 + '🇰', 17 + '🇱', 18 + '🇲', 19 + '🇳', 20 + '🇴', 21 + '🇵', 22 + '🇶', 23 + '🇷', 24 + '🇸', 25 + '🇹', 26 + ]; 27 + 28 + function getTime(content: string) { 29 + const regex = /^(?:(\d+)d\s*?)?(?:(\d+)h\s*?)?(?:(\d+)m\s*?)?$/; 30 + const matched = content.match(regex); 31 + if (matched) { 32 + const d = parseInt(matched[1], 10) || 0; 33 + const h = parseInt(matched[2], 10) || 0; 34 + const m = parseInt(matched[3], 10) || 0; 35 + if (d + h + m > 0) { 36 + return [d, h, m]; 37 + } 38 + return false; 39 + } 40 + return false; 41 + } 42 + 43 + export const vote: magibotCommand = { 44 + name: 'vote', 45 + dev: false, 46 + main(content, msg) { 47 + const authorID = msg.author.id; 48 + msg.channel.send('What do you want the vote to be about?').then((mess) => { 49 + msg.delete(); 50 + msg.channel 51 + .awaitMessages((m) => m.author.id === authorID, { max: 1, time: 60000 }) 52 + .then((collected) => { 53 + if (collected.first()) { 54 + const topic = collected.first()!.content; 55 + collected.first()!.delete(); 56 + mess.delete(); 57 + msg.channel 58 + .send( 59 + 'How long is this vote supposed to last? (use d h m format, e.g.: `2d 3h 5m`)', 60 + ) 61 + .then((mess1) => { 62 + msg.channel 63 + .awaitMessages((m) => m.author.id === authorID, { 64 + max: 1, 65 + time: 60000, 66 + }) 67 + .then((collected2) => { 68 + if (collected2.first() && collected2.first()!.content) { 69 + // time as array of values 70 + const time = getTime(collected2.first()!.content); 71 + collected2.first()!.delete(); 72 + mess1.delete(); 73 + // do checks on time validity 74 + if (!time) { 75 + msg.channel.send('Please use a valid time.'); 76 + return; 77 + } 78 + if ( 79 + time[0] > 7 80 + || (time[0] > 6 && (time[1] > 0 || time[2] > 0)) 81 + ) { 82 + msg.channel.send( 83 + 'Votes are not allowed to last longer than 7 days, please use a valid time.', 84 + ); 85 + return; 86 + } 87 + msg.channel 88 + .send( 89 + `What do you want the options to be for **${topic}**? Use \`option1|option2[|etc...]\``, 90 + ) 91 + .then((mess2) => { 92 + msg.channel 93 + .awaitMessages((m) => m.author.id === authorID, { 94 + max: 1, 95 + time: 60000, 96 + }) 97 + .then((collected3) => { 98 + if (collected3.first()) { 99 + const args = collected3 100 + .first()! 101 + .content.split('|'); 102 + collected3.first()!.delete(); 103 + mess2.delete(); 104 + if (args[0] && args.length <= 20) { 105 + let str = ''; 106 + args.forEach((v, i) => { 107 + str += `${reactions[i]} ${v}\n`; 108 + }); 109 + let timestr = ''; 110 + const times = ['days ', 'hours ', 'minutes ']; 111 + time.forEach((v, s) => { 112 + if (v > 0) { 113 + timestr += `${v} ${times[s]}`; 114 + } 115 + }); 116 + msg.channel 117 + .send( 118 + `Do you want to start the vote **${topic}** lasting **${timestr}**with the options\n${str}`, 119 + ) 120 + .then((mess3) => { 121 + const filter = (reaction, user) => (reaction.emoji.name === '☑' 122 + || reaction.emoji.name === '❌') 123 + && user.id === authorID; 124 + mess3.react('☑'); 125 + mess3.react('❌'); 126 + mess3 127 + .awaitReactions(filter, { 128 + max: 1, 129 + time: 20000, 130 + }) 131 + .then((reacts) => { 132 + mess3.delete(); 133 + if ( 134 + reacts.first() 135 + && reacts.first()!.emoji.name === '☑' 136 + ) { 137 + const dat = new Date(); 138 + const date = new Date( 139 + dat.getFullYear(), 140 + dat.getMonth(), 141 + dat.getDate() + time[0], 142 + dat.getHours() + time[1], 143 + dat.getMinutes() + time[2], 144 + dat.getSeconds(), 145 + 0, 146 + ); 147 + msg.channel 148 + .send( 149 + `**${topic}**\n*by ${msg.author}, ends on ${date}*\n\n${str}`, 150 + ) 151 + .then(async (ms) => { 152 + asyncForEach( 153 + args, 154 + async (val, i) => { 155 + await ms.react( 156 + reactions[i], 157 + ); 158 + }, 159 + ); 160 + // vote structure 161 + const vt = { 162 + messageID: ms.id, 163 + channelID: ms.channel.id, 164 + options: args, 165 + topic, 166 + date, 167 + guildid: ms.guild?.id, 168 + authorID, 169 + }; 170 + data.addVote(vt); 171 + }); 172 + } else if (reacts.first()) { 173 + msg.channel.send( 174 + `successfully canceled vote **${topic}**`, 175 + ); 176 + } else { 177 + msg.channel.send( 178 + 'canceled vote due to timeout.', 179 + ); 180 + } 181 + }); 182 + }); 183 + } else if (!args) { 184 + msg.channel.send( 185 + 'Please try again and add some options', 186 + ); 187 + } else { 188 + msg.channel.send( 189 + 'There are only up to 20 options allowed, please try again with less options', 190 + ); 191 + } 192 + } else { 193 + msg.channel.send( 194 + 'canceled vote due to timeout.', 195 + ); 196 + } 197 + }); 198 + }); 199 + } else { 200 + msg.channel.send('canceled vote due to timeout.'); 201 + } 202 + }); 203 + }); 204 + } else { 205 + msg.channel.send('canceled vote due to timeout.'); 206 + } 207 + }); 208 + }); 209 + }, 210 + ehelp() { 211 + return [ 212 + { 213 + name: '', 214 + value: 215 + 'Start a vote with up to 20 different options. The maximum duration is 7 days.\nThe setup includes multiple steps which will be explained when you use the command.', 216 + }, 217 + ]; 218 + }, 219 + admin: false, 220 + hide: false, 221 + perm: ['SEND_MESSAGES', 'MANAGE_MESSAGES'], 222 + category: commandCategories.util, 223 + };
+1111
src/db.ts
··· 1 + import DBL from 'dblapi.js'; 2 + import { MongoClient } from 'mongodb'; 3 + import { 4 + Client, TextChannel, Message, Guild, GuildMember, 5 + } from 'discord.js'; 6 + import { OWNERID, PREFIXES, resetPrefixes } from './shared_assets'; 7 + import { asyncForEach } from './bamands'; 8 + 9 + const config = process.env; 10 + const dbl = new DBL( 11 + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjM4NDgyMDIzMjU4MzI0OTkyMSIsImJvdCI6dHJ1ZSwiaWF0IjoxNTE5NTgyMjYyfQ.df01BPWTU8O711eB_hive_T6RUjgzpBtXEcVSj63RW0', 12 + ); 13 + 14 + if (!config.dburl) { 15 + throw new Error('Missing DB connection URL'); 16 + } 17 + const url = config.dburl; 18 + 19 + // Define Methods: 20 + function getuser(userid: string, guildID: string) { 21 + return MongoClient.connect(url).then(async (mclient) => { 22 + const db = await mclient.db('MagiBot'); 23 + const result = await db.collection('users').findOneAndUpdate( 24 + { userID: userid, guildID }, 25 + { 26 + $setOnInsert: { 27 + warnings: 0, 28 + kicks: 0, 29 + bans: 0, 30 + botusage: 0, 31 + sound: false, 32 + }, 33 + }, 34 + { returnOriginal: false, upsert: true }, 35 + ); 36 + mclient.close(); 37 + return result.value; 38 + }); 39 + } 40 + // eslint-disable-next-line require-await 41 + async function saltGuild(salter, guildID: string, add = 1, reset = false) { 42 + return MongoClient.connect(url).then(async (mclient) => { 43 + const db = mclient.db('MagiBot'); 44 + const user = await db 45 + .collection('saltrank') 46 + .findOne({ salter, guild: guildID }); 47 + if (!user) { 48 + const myobj = { salter, salt: 1, guild: guildID }; 49 + await db.collection('saltrank').insertOne(myobj); 50 + } else { 51 + const slt = user.salt + add; 52 + if (slt <= 0 || reset) { 53 + await db.collection('saltrank').deleteOne({ salter, guild: guildID }); 54 + } else { 55 + const update = { $set: { salt: slt } }; 56 + await db 57 + .collection('saltrank') 58 + .updateOne({ salter, guild: guildID }, update); 59 + } 60 + } 61 + mclient.close(); 62 + }); 63 + } 64 + // eslint-disable-next-line require-await 65 + async function addSalt(userid: string, reporter: string, guildID: string) { 66 + return MongoClient.connect(url).then((mclient) => { 67 + const db = mclient.db('MagiBot'); 68 + const date = new Date(); 69 + const myobj = { 70 + salter: userid, 71 + reporter, 72 + date, 73 + guild: guildID, 74 + }; 75 + return db 76 + .collection('salt') 77 + .insertOne(myobj) 78 + .then(async () => { 79 + await saltGuild(userid, guildID, 1); 80 + mclient.close(); 81 + return 0; 82 + }); 83 + }); 84 + } 85 + function updateUser(userid: string, update, guildID: string) { 86 + MongoClient.connect(url, (err, mclient) => { 87 + if (err) throw err; 88 + const db = mclient.db('MagiBot'); 89 + db.collection('users').updateOne( 90 + { userID: userid, guildID }, 91 + update, 92 + (err2) => { 93 + if (err2) throw err2; 94 + mclient.close(); 95 + }, 96 + ); 97 + }); 98 + } 99 + function saltDowntimeDone(userid1: string, userid2: string) { 100 + // get newest entry in salt 101 + return MongoClient.connect(url).then(async (mclient) => { 102 + const db = mclient.db('MagiBot'); 103 + const d2 = await db 104 + .collection('salt') 105 + .find<{ date: Date }>({ salter: userid1, reporter: userid2 }) 106 + .sort({ date: -1 }) 107 + .limit(1) 108 + .toArray(); 109 + mclient.close(); 110 + if (d2[0]) { 111 + const d1 = new Date(); 112 + const ret = (d1.getTime() - d2[0].date.getTime()) / 1000 / 60 / 60; 113 + return ret; 114 + } 115 + return 2; 116 + }); 117 + } 118 + function firstSettings(guildID: string) { 119 + return MongoClient.connect(url).then(async (mclient) => { 120 + const db = mclient.db('MagiBot'); 121 + await db.collection('settings').insertOne({ 122 + _id: guildID, 123 + commandChannels: [], 124 + adminRoles: [], 125 + joinChannels: [], 126 + blacklistedUsers: [], 127 + blacklistedEveryone: [], 128 + saltKing: false, 129 + saltRole: false, 130 + notChannel: false, 131 + prefix: config.prefix, 132 + lastConnected: new Date(), 133 + }); 134 + const ret = await db.collection('settings').findOne({ _id: guildID }); 135 + mclient.close(); 136 + return ret; 137 + }); 138 + } 139 + function getSettings(guildID: string) { 140 + return MongoClient.connect(url).then(async (mclient) => { 141 + const db = mclient.db('MagiBot'); 142 + let result = await db.collection('settings').findOne({ _id: guildID }); 143 + if (!result) { 144 + result = await firstSettings(guildID); 145 + } 146 + mclient.close(); 147 + return result; 148 + }); 149 + } 150 + async function checkGuild(id: string) { 151 + // create settings 152 + if (await getSettings(id)) { 153 + return true; 154 + } 155 + return false; 156 + } 157 + function toggleDBLvoted(userid: string, votd: boolean) { 158 + MongoClient.connect(url).then(async (mclient) => { 159 + const db = await mclient.db('MagiBot'); 160 + await db 161 + .collection('DBLreminder') 162 + .updateOne({ _id: userid }, { $set: { voted: votd } }); 163 + mclient.close(); 164 + }); 165 + } 166 + 167 + // automatic deletion of reports: 168 + async function onHour(bot: Client, isFirst: boolean) { 169 + const d = new Date(); 170 + const h = new Date( 171 + d.getFullYear(), 172 + d.getMonth(), 173 + d.getDate() + 1, 174 + 0, 175 + 0, 176 + 0, 177 + 0, 178 + ); 179 + const e = h.getTime() - d.getTime(); 180 + if (e > 100) { 181 + // some arbitrary time period 182 + setTimeout(onHour.bind(null, bot, false), e); 183 + } 184 + let msg: Message; 185 + if (isFirst) { 186 + const chann = bot.channels.fetch('382233880469438465'); 187 + msg = await ((await chann) as TextChannel)?.send('0 %'); 188 + } 189 + 190 + const t0 = process.hrtime(); 191 + const nd = new Date(); 192 + nd.setDate(nd.getDate() - 7); 193 + const guilds = bot.guilds.cache.array(); 194 + await MongoClient.connect(url).then(async (mclient) => { 195 + const db = mclient.db('MagiBot'); 196 + let counter = 0; 197 + let percCounter = 0; 198 + await asyncForEach(guilds, async (G) => { 199 + const guildID = G.id; 200 + await checkGuild(guildID); 201 + // update the guild settings entry so that it does NOT get deleted 202 + await db 203 + .collection('settings') 204 + .updateOne({ _id: guildID }, { $set: { lastConnected: d } }); 205 + 206 + const ranking = await db 207 + .collection('saltrank') 208 + .find({ guild: guildID }) 209 + .toArray(); 210 + 211 + asyncForEach(ranking, async (report) => { 212 + const removeData = await db.collection('salt').deleteMany({ 213 + date: { $lt: nd }, 214 + guild: guildID, 215 + salter: report.salter, 216 + }); 217 + if (removeData.deletedCount && removeData.deletedCount > 0) { 218 + const slt = report.salt - removeData.deletedCount; 219 + if (slt <= 0) { 220 + await db 221 + .collection('saltrank') 222 + .deleteOne({ salter: report.salter, guild: guildID }); 223 + } else { 224 + await db 225 + .collection('saltrank') 226 + .updateOne( 227 + { salter: report.salter, guild: guildID }, 228 + { $set: { salt: slt } }, 229 + ); 230 + } 231 + } 232 + }); 233 + }); 234 + // await updateSaltKing(G); this shouldnt be needed anymore 235 + 236 + // update percentage message 237 + if (msg) { 238 + const percentage = Math.round((++counter / guilds.length) * 100); 239 + if (percentage - percCounter > 0) { 240 + let uptime = ''; 241 + const u = process.hrtime(t0); 242 + // mins 243 + let x = Math.floor(u[0] / 60); 244 + if (x > 0) { 245 + uptime += `${x}m : `; 246 + } 247 + // secs 248 + x = u[0] % 60; 249 + if (x >= 0) { 250 + uptime += `${x}s`; 251 + } 252 + percCounter = percentage; 253 + msg.edit(`${percentage} % with ${uptime} passed`); 254 + } 255 + } 256 + await mclient.close(); 257 + }); 258 + 259 + // delete every guild where lastConnected < nd from the DB TODO 260 + await MongoClient.connect(url).then(async (mclient) => { 261 + const db = await mclient.db('MagiBot'); 262 + // find all guilds that have not connected for a week 263 + // or dont have the lastConnected attribute at all 264 + const guilds2 = await db 265 + .collection('settings') 266 + .find({ 267 + $or: [ 268 + { lastConnected: { $lt: nd } }, 269 + { lastConnected: { $exists: false } }, 270 + ], 271 + }) 272 + .toArray(); 273 + 274 + await asyncForEach(guilds2, async (guild) => { 275 + // ignore salt and saltrank, as they are removed after 7 days anyways 276 + // eslint-disable-next-line no-underscore-dangle 277 + const guildID = guild._id; 278 + // remove all data saved for those guilds 279 + await db.collection('stillmuted').deleteMany({ guildid: guildID }); 280 + await db.collection('users').deleteMany({ guildID }); 281 + await db.collection('votes').deleteMany({ guildid: guildID }); 282 + await db.collection('settings').deleteOne({ _id: guildID }); 283 + }); 284 + mclient.close(); 285 + }); 286 + } 287 + 288 + async function dblReminder(bot: Client) { 289 + const d = new Date(); 290 + const h = new Date( 291 + d.getFullYear(), 292 + d.getMonth(), 293 + d.getDate(), 294 + d.getHours(), 295 + d.getMinutes() + 5, 296 + 0, 297 + 0, 298 + ); 299 + const e = h.getTime() - d.getTime(); 300 + if (e > 100) { 301 + // some arbitrary time period 302 + setTimeout(dblReminder.bind(null, bot), e); 303 + } 304 + await MongoClient.connect(url).then(async (mclient) => { 305 + const db = mclient.db('MagiBot'); 306 + const users = await db 307 + .collection('DBLreminder') 308 + .find() 309 + .toArray(); 310 + mclient.close(); 311 + if (users) { 312 + await asyncForEach(users, async (u) => { 313 + // eslint-disable-next-line no-underscore-dangle 314 + const user = await bot.users.fetch(u._id); 315 + let dblFailed = false; 316 + const hasVoted = await dbl.hasVoted(user.id).catch(() => { 317 + dblFailed = true; 318 + }); 319 + if (!dblFailed) { 320 + if (!hasVoted && !u.voted) { 321 + await user 322 + .send( 323 + `Hey there ${user} you can now vote for me again! (<https://discordbots.org/bot/384820232583249921> and <https://bots.ondiscord.xyz/bots/384820232583249921>)\nIf you don't want these reminders anymore use \`k.dbl\` in a server im on.`, 324 + ) 325 + .catch(() => {}); 326 + toggleDBLvoted(user.id, true); 327 + } else if (hasVoted && u.voted) { 328 + toggleDBLvoted(user.id, false); 329 + } 330 + } 331 + }); 332 + } 333 + }); 334 + } 335 + const reactions = [ 336 + '🇦', 337 + '🇧', 338 + '🇨', 339 + '🇩', 340 + '🇪', 341 + '🇫', 342 + '🇬', 343 + '🇭', 344 + '🇮', 345 + '🇯', 346 + '🇰', 347 + '🇱', 348 + '🇲', 349 + '🇳', 350 + '🇴', 351 + '🇵', 352 + '🇶', 353 + '🇷', 354 + '🇸', 355 + '🇹', 356 + ]; 357 + // this should take care of everything that needs to be done when a vote ends 358 + async function endVote( 359 + vote: { 360 + messageID: Message['id']; 361 + channelID: Message['channel']['id']; 362 + authorID: string; 363 + options: any; 364 + topic: string; 365 + date: Date; 366 + }, 367 + bot: Client, 368 + ) { 369 + const chann = (await bot.channels.fetch(vote.channelID)) as TextChannel; 370 + if (chann) { 371 + const msg = await chann.messages.fetch(vote.messageID); 372 + if (msg) { 373 + const reacts = msg.reactions; 374 + let finalReact: Array<{ reaction: string; count: number }> = []; 375 + asyncForEach(reactions, async (x) => { 376 + if (x >= vote.options.length) { 377 + return; 378 + } 379 + const react = reacts.cache.get(reactions[x]); 380 + if (react && react.count) { 381 + if (!finalReact[0] || finalReact[0].count <= react.count) { 382 + if (!finalReact[0] || finalReact[0].count < react.count) { 383 + finalReact = [{ reaction: x, count: react.count }]; 384 + } else { 385 + finalReact.push({ reaction: x, count: react.count }); 386 + } 387 + } 388 + } 389 + }); 390 + if (finalReact[0]) { 391 + if (finalReact.length > 1) { 392 + let str = `**${vote.topic}** ended.\n\nThere was a tie between `; 393 + if (vote.authorID) { 394 + str = `**${vote.topic}** by <@${vote.authorID}> ended.\n\nThere was a tie between `; 395 + } 396 + finalReact.forEach((react, i) => { 397 + str += `**${vote.options[react.reaction]}**`; 398 + if (i < finalReact.length - 2) { 399 + str += ', '; 400 + } else if (i === finalReact.length - 2) { 401 + str += ' and '; 402 + } 403 + }); 404 + str += ` with each having ** ${finalReact[0].count - 1} ** votes.`; 405 + await msg.edit(str); 406 + } else { 407 + let str = `**${vote.topic}** ended.\n\nThe result is **${ 408 + vote.options[finalReact[0].reaction] 409 + }** with **${finalReact[0].count - 1}** votes.`; 410 + if (vote.authorID) { 411 + str = `**${vote.topic}** by <@${ 412 + vote.authorID 413 + }> ended.\n\nThe result is **${ 414 + vote.options[finalReact[0].reaction] 415 + }** with **${finalReact[0].count - 1}** votes.`; 416 + } 417 + await msg.edit(str); 418 + } 419 + } else { 420 + let str = `**${vote.topic}** ended.\n\nCould not compute a result.`; 421 + if (vote.authorID) { 422 + str = `**${vote.topic}** by <@${vote.authorID}> ended.\n\nCould not compute a result.`; 423 + } 424 + await msg.edit(str); 425 + } 426 + await msg.reactions.removeAll(); 427 + } 428 + } 429 + } 430 + function voteCheck(bot: Client) { 431 + const d = new Date(); 432 + const h = new Date( 433 + d.getFullYear(), 434 + d.getMonth(), 435 + d.getDate(), 436 + d.getHours(), 437 + d.getMinutes(), 438 + d.getSeconds() + 10, 439 + 0, 440 + ); 441 + const e = h.getTime() - d.getTime(); 442 + if (e > 100) { 443 + // some arbitrary time period 444 + setTimeout(voteCheck.bind(null, bot), e); 445 + } 446 + // do vote stuff 447 + MongoClient.connect(url).then(async (mclient) => { 448 + const db = mclient.db('MagiBot'); 449 + const nd = new Date(); 450 + const votes = await db 451 + .collection('votes') 452 + .find({ date: { $lte: nd } }) 453 + .toArray(); 454 + await asyncForEach(votes, async (vote) => { 455 + await endVote(vote, bot); 456 + await db.collection('votes').deleteOne(vote); 457 + }); 458 + mclient.close(); 459 + }); 460 + // endof vote stuff 461 + } 462 + 463 + function isInDBL(userID: string) { 464 + return MongoClient.connect(url).then(async (mclient) => { 465 + const db = await mclient.db('MagiBot'); 466 + const ret = await db 467 + .collection('DBLreminder') 468 + .find({ _id: userID }) 469 + .count(); 470 + mclient.close(); 471 + return ret; 472 + }); 473 + } 474 + 475 + function toggleDBL(userID: string, add: boolean) { 476 + MongoClient.connect(url).then(async (mclient) => { 477 + const db = await mclient.db('MagiBot'); 478 + if (add && !(await isInDBL(userID))) { 479 + await db 480 + .collection('DBLreminder') 481 + .insertOne({ _id: userID, voted: false }); 482 + } else if (!add) { 483 + await db.collection('DBLreminder').deleteOne({ _id: userID }); 484 + } 485 + mclient.close(); 486 + }); 487 + } 488 + 489 + function toggleStillMuted(userID: string, guildID: string, add: boolean) { 490 + MongoClient.connect(url).then(async (mclient) => { 491 + const db = await mclient.db('MagiBot'); 492 + if ( 493 + add 494 + && !( 495 + (await db 496 + .collection('stillMuted') 497 + .find({ userid: userID, guildid: guildID }) 498 + .count()) > 0 499 + ) 500 + ) { 501 + await db 502 + .collection('stillMuted') 503 + .insertOne({ userid: userID, guildid: guildID }); 504 + } else if (!add) { 505 + await db 506 + .collection('stillMuted') 507 + .deleteMany({ userid: userID, guildid: guildID }); 508 + } 509 + mclient.close(); 510 + }); 511 + } 512 + async function getSaltKing(guildID: string) { 513 + const settings = await getSettings(guildID); 514 + return settings.saltKing; 515 + } 516 + async function getSaltRole(guildID: string) { 517 + const set = await getSettings(guildID); 518 + return set.saltRole; 519 + } 520 + function setSettings(guildID: string, settings) { 521 + return MongoClient.connect(url).then(async (mclient) => { 522 + const db = mclient.db('MagiBot'); 523 + if (await getSettings(guildID)) { 524 + await db 525 + .collection('settings') 526 + .updateOne({ _id: guildID }, { $set: settings }); 527 + } 528 + mclient.close(); 529 + return true; 530 + }); 531 + } 532 + async function setSaltRole(guildID: string, roleID: string) { 533 + await setSettings(guildID, { saltRole: roleID }); 534 + } 535 + async function getNotChannel(guildID:string) { 536 + const set = await getSettings(guildID); 537 + return set.notChannel; 538 + } 539 + // top 5 salty people 540 + function topSalt(guildID:string) { 541 + return MongoClient.connect(url).then(async (mclient) => { 542 + const db = mclient.db('MagiBot'); 543 + const result = await db 544 + .collection('saltrank') 545 + .find({ guild: guildID }) 546 + .sort({ salt: -1 }) 547 + .limit(5) 548 + .toArray(); 549 + mclient.close(); 550 + if (!result) { 551 + return []; 552 + } 553 + return result; 554 + }); 555 + } 556 + function setSaltKing(guildID: string, userID: string) { 557 + return setSettings(guildID, { saltKing: userID }); 558 + } 559 + async function updateSaltKing(G: Guild) { 560 + if (G.available && G.me) { 561 + if ( 562 + G.me.hasPermission('MANAGE_ROLES', { 563 + checkAdmin: true, 564 + checkOwner: false, 565 + }) 566 + ) { 567 + const SaltKing = await getSaltKing(G.id); 568 + let SaltRole = await getSaltRole(G.id); 569 + const groles = await G.roles; 570 + if (!SaltRole || !groles.cache.has(SaltRole)) { 571 + if (G.roles.cache.size < 250) { 572 + await G.roles 573 + .create({ 574 + data: { 575 + name: 'SaltKing', 576 + color: '#FFFFFF', 577 + position: 0, 578 + permissions: [], 579 + mentionable: true, 580 + }, 581 + reason: 582 + 'SaltKing role needed for Saltranking to work. You can adjust this role if you like.', 583 + }) 584 + .then(async (role) => { 585 + await setSaltRole(G.id, role.id); 586 + SaltRole = role.id; 587 + }); 588 + } else { 589 + const channel = await getNotChannel(G.id); 590 + if (channel) { 591 + const chan = G.channels.cache.get(channel); 592 + if (chan?.permissionsFor(G.me)?.has('SEND_MESSAGES')) { 593 + (chan as TextChannel).send( 594 + `Hey there ${G.owner}!\nI regret to inform you that this server has 250 roles and I therefore can't add SaltKing. If you want to manage the role yourself delete one and then just change the settings of the role i create automatically.`, 595 + ); 596 + } 597 + } 598 + return; 599 + } 600 + } 601 + const sltID = await topSalt(G.id); 602 + let saltID: string | undefined; 603 + if (sltID[0]) { 604 + saltID = sltID[0].salter; 605 + } 606 + const role = await groles.fetch(SaltRole); 607 + if (role && role.position < G.me.roles.highest.position) { 608 + if (SaltKing && saltID !== SaltKing) { 609 + const user = await G.members.fetch(SaltKing).catch(() => {}); 610 + if (user) { 611 + user.roles.remove(SaltRole, 'Is not as salty anymore'); 612 + } 613 + } 614 + if (saltID) { 615 + const nuser = await G.members.fetch(saltID).catch(() => {}); 616 + if (nuser) { 617 + if (!nuser.roles.cache.has(SaltRole)) { 618 + await nuser.roles.add(SaltRole, 'Saltiest user'); 619 + } 620 + } 621 + if (saltID !== SaltKing) { 622 + await setSaltKing(G.id, saltID); 623 + } 624 + } 625 + } else { 626 + const channel = await getNotChannel(G.id); 627 + if (channel) { 628 + const chan = G.channels.cache.get(channel); 629 + if (chan?.permissionsFor(G.me)?.has('SEND_MESSAGES')) { 630 + (chan as TextChannel).send( 631 + `Hey there ${G.owner}!\nI regret to inform you that my highest role is beneath <@&${SaltRole}>, which has the effect that i cannot give or take if from users.`, 632 + ); 633 + } 634 + } 635 + } 636 + } else { 637 + const channel = await getNotChannel(G.id); 638 + if (channel) { 639 + const chan = G.channels.cache.get(channel); 640 + if (chan?.permissionsFor(G.me)?.has('SEND_MESSAGES')) { 641 + (chan as TextChannel).send( 642 + `Hey there ${G.owner}!\nI regret to inform you that i have no permission to manage roles and therefore can't manage the SaltKing role.`, 643 + ); 644 + } 645 + } 646 + } 647 + } 648 + } 649 + function setNotChannel(guildID: string, channelID: String | false) { 650 + return setSettings(guildID, { notChannel: channelID }); 651 + } 652 + async function sendUpdate(update: string, bot: Client) { 653 + await asyncForEach(bot.guilds.cache.array(), async (G) => { 654 + if (G.available) { 655 + const cid = await getNotChannel(G.id); 656 + if (cid) { 657 + const channel = G.channels.cache.get(cid) as TextChannel; 658 + if (channel && G.me) { 659 + if (channel.permissionsFor(G.me)?.has('SEND_MESSAGES')) { 660 + if (G.id === '380669498014957569') { 661 + channel.send(`<@&460218236185739264> ${update}`); 662 + } else { 663 + channel.send(update); 664 + } 665 + } 666 + } else { 667 + setNotChannel(G.id, false); 668 + } 669 + } 670 + } 671 + }); 672 + } 673 + 674 + async function getSalt(userid: string, guildID: string) { 675 + return MongoClient.connect(url).then(async (mclient) => { 676 + const db = mclient.db('MagiBot'); 677 + const result = await db 678 + .collection('saltrank') 679 + .findOne({ salter: userid, guild: guildID }); 680 + mclient.close(); 681 + if (!result) { 682 + return 0; 683 + } 684 + return result.salt; 685 + }); 686 + } 687 + 688 + async function saltUp( 689 + userid1: string, 690 + userid2: string, 691 + ad: boolean, 692 + guildID: string, 693 + ) { 694 + const time = await saltDowntimeDone(userid1, userid2); 695 + if (time > 1 || ad) { 696 + return addSalt(userid1, userid2, guildID); 697 + } 698 + return time; 699 + } 700 + 701 + async function usageUp(userid: string, guildID: string) { 702 + const user = await getuser(userid, guildID); 703 + const updateval = user.botusage + 1; 704 + updateUser(userid, { $set: { botusage: updateval } }, guildID); 705 + } 706 + 707 + async function checks(userid: string, guildID: string) { 708 + // maybe add more checks 709 + if (await getuser(userid, guildID)) { 710 + return true; 711 + } 712 + // else 713 + return false; 714 + } 715 + function setPrefix(guildID: string, pref?: string) { 716 + return setSettings(guildID, { prefix: pref }); 717 + } 718 + async function getPrefix(guildID: string) { 719 + let settings = await getSettings(guildID); 720 + settings = settings.prefix; 721 + if (!settings) { 722 + await setPrefix(guildID, config.prefix); 723 + return config.prefix; 724 + } 725 + return settings; 726 + } 727 + 728 + async function getAdminRole(guildID: string) { 729 + const settings = await getSettings(guildID); 730 + return settings.adminRoles as Array<string>; 731 + } 732 + 733 + async function setAdminRole(guildID: string, roleID: string, insert: boolean) { 734 + const roles = await getAdminRole(guildID); 735 + if (insert) { 736 + if (!roles.includes(roleID)) { 737 + roles.push(roleID); 738 + } 739 + } else { 740 + const index = roles.indexOf(roleID); 741 + if (index > -1) { 742 + roles.splice(index, 1); 743 + } 744 + } 745 + const settings = { adminRoles: roles }; 746 + return setSettings(guildID, settings); 747 + } 748 + 749 + async function getCommandChannel(guildID: string) { 750 + const settings = await getSettings(guildID); 751 + return settings.commandChannels; 752 + } 753 + 754 + async function setCommandChannel( 755 + guildID: string, 756 + cid: string, 757 + insert: boolean, 758 + ) { 759 + const channels = await getCommandChannel(guildID); 760 + if (insert) { 761 + if (!channels.includes(cid)) { 762 + channels.push(cid); 763 + } 764 + } else { 765 + const index = channels.indexOf(cid); 766 + if (index > -1) { 767 + channels.splice(index, 1); 768 + } 769 + } 770 + const settings = { commandChannels: channels }; 771 + return setSettings(guildID, settings); 772 + } 773 + 774 + async function getJoinChannel(guildID: string) { 775 + const settings = await getSettings(guildID); 776 + return settings.joinChannels; 777 + } 778 + 779 + async function setJoinChannel(guildID: string, cid: string, insert: boolean) { 780 + const channels = await getJoinChannel(guildID); 781 + if (insert) { 782 + if (!channels.includes(cid)) { 783 + channels.push(cid); 784 + } 785 + } else { 786 + const index = channels.indexOf(cid); 787 + if (index > -1) { 788 + channels.splice(index, 1); 789 + } 790 + } 791 + const settings = { joinChannels: channels }; 792 + return setSettings(guildID, settings); 793 + } 794 + 795 + async function getBlacklistedUser(guildID: string) { 796 + const settings = await getSettings(guildID); 797 + return settings.blacklistedUsers; 798 + } 799 + 800 + async function isBlacklistedUser(userid: string, guildID: string) { 801 + const users = await getBlacklistedUser(guildID); 802 + return users.includes(userid); 803 + } 804 + 805 + async function setBlacklistedUser( 806 + userid: string, 807 + guildID: string, 808 + insert: boolean, 809 + ) { 810 + const users = await getBlacklistedUser(guildID); 811 + if (insert) { 812 + if (!users.includes(userid)) { 813 + users.push(userid); 814 + } 815 + } else { 816 + const index = users.indexOf(userid); 817 + if (index > -1) { 818 + users.splice(index, 1); 819 + } 820 + } 821 + const settings = { blacklistedUsers: users }; 822 + return setSettings(guildID, settings); 823 + } 824 + /* eslint-disable */ 825 + // TODO some time later , blacklist @everyone in these channels 826 + async function getBlacklistedEveryone(guildID: string) { 827 + const settings = await getSettings(guildID); 828 + return settings.blacklistedEveryone; 829 + } 830 + 831 + async function setBlacklistedEveryone( 832 + guildID: string, 833 + cid: string, 834 + insert: boolean 835 + ) {} 836 + /* eslint-enable */ 837 + 838 + async function joinsound( 839 + userid: string, 840 + surl: string | false, 841 + guildID: string, 842 + ) { 843 + return MongoClient.connect(url).then(async (mclient) => { 844 + const db = mclient.db('MagiBot'); 845 + if (await checks(userid, guildID)) { 846 + const update = { $set: { sound: surl } }; 847 + await db 848 + .collection('users') 849 + .updateOne({ userID: userid, guildID }, update); 850 + } 851 + mclient.close(); 852 + return true; 853 + }); 854 + } 855 + 856 + export default { 857 + async startup(bot: Client) { 858 + // create Collection 859 + await MongoClient.connect(url).then(async (mclient) => { 860 + const db = mclient.db('MagiBot'); 861 + if (!db.collection('settings')) { 862 + await db.createCollection('settings').then(() => {}); 863 + } 864 + // Dataset of salt 865 + if (!db.collection('salt')) { 866 + db.createCollection('salt', (err) => { 867 + if (err) throw err; 868 + }); 869 + } 870 + if (!db.collection('saltrank')) { 871 + db.createCollection('saltrank', (err) => { 872 + if (err) throw err; 873 + }); 874 + } 875 + if (!db.collection('users')) { 876 + db.createCollection('users', (err) => { 877 + if (err) throw err; 878 + }); 879 + } 880 + if (!db.collection('votes')) { 881 + db.createCollection('votes', (err) => { 882 + if (err) throw err; 883 + }); 884 + } 885 + mclient.close(); 886 + }); 887 + // repeating functions: 888 + onHour(bot, true); 889 + dblReminder(bot); 890 + voteCheck(bot); 891 + }, 892 + async getUser(userid: string, guildID: string) { 893 + const result = await getuser(userid, guildID); 894 + return result; 895 + }, 896 + usageUp(userid: string, guildID: string) { 897 + usageUp(userid, guildID); 898 + }, 899 + async saltUp(userid1: string, userid2: string, G: Guild) { 900 + const ret = await saltUp(userid1, userid2, false, G.id); 901 + updateSaltKing(G); 902 + return ret; 903 + }, 904 + async saltUpAdmin(userid1: string, userid2: string, G: Guild) { 905 + const ret = await saltUp(userid1, userid2, true, G.id); 906 + updateSaltKing(G); 907 + return ret; 908 + }, 909 + getSalt(userid: string, guildID: string) { 910 + return getSalt(userid, guildID); 911 + }, 912 + async getUsage(userid: string, guildID: string) { 913 + const user = await getuser(userid, guildID); 914 + return parseInt(user.botusage, 10); 915 + }, 916 + async remOldestSalt(userid: string, G: Guild) { 917 + return MongoClient.connect(url).then(async (mclient) => { 918 + const guildID = G.id; 919 + const db = mclient.db('MagiBot'); 920 + const id = await db 921 + .collection('salt') 922 + .find({ salter: userid, guild: guildID }) 923 + .sort({ date: 1 }) 924 + .limit(1) 925 + .toArray(); 926 + if (id[0]) { 927 + // eslint-disable-next-line no-underscore-dangle 928 + await db.collection('salt').deleteOne({ _id: id[0]._id }); 929 + saltGuild(userid, guildID, -1); 930 + mclient.close(); 931 + updateSaltKing(G); 932 + return true; 933 + } 934 + mclient.close(); 935 + return false; 936 + }); 937 + }, 938 + async addGuild(guildID: string) { 939 + await checkGuild(guildID); 940 + }, 941 + topSalt(guildID: string) { 942 + return topSalt(guildID); 943 + }, 944 + async joinable(guildID: string, cid: string) { 945 + const channels = await getJoinChannel(guildID); 946 + return channels.includes(cid); 947 + }, 948 + async isAdmin(guildID: string, user: GuildMember) { 949 + // checks for admin and Owner, they can always use 950 + if (user.hasPermission('ADMINISTRATOR', { checkAdmin: true, checkOwner: true })) { 951 + return true; 952 + } 953 + // Owner is always admin hehe 954 + if (user.id === OWNERID) { 955 + return true; 956 + } 957 + const roles = await getAdminRole(guildID); 958 + let ret = false; 959 + roles.forEach((role) => { 960 + if (user.roles.cache.has(role)) { 961 + ret = true; 962 + } 963 + }); 964 + return ret; 965 + }, 966 + isAdminRole: async (guildID: string, adminRole: string) => { 967 + const roles = await getAdminRole(guildID); 968 + let ret = false; 969 + roles.forEach((role) => { 970 + if (adminRole === role) { 971 + ret = true; 972 + } 973 + }); 974 + return ret; 975 + }, 976 + async commandAllowed(guildID: string, cid: string) { 977 + const channels = await getCommandChannel(guildID); 978 + return channels.length === 0 || channels.includes(cid); 979 + }, 980 + async isCommandChannel(guildID: string, cid: string) { 981 + const channels = await getCommandChannel(guildID); 982 + return channels.includes(cid); 983 + }, 984 + async commandChannel(guildID: string) { 985 + const channels = await getCommandChannel(guildID); 986 + let out = ''; 987 + channels.forEach((channel: string) => { 988 + out += ` <#${channel}>`; 989 + }); 990 + return out; 991 + }, 992 + async getSound(userid: string, guildID: string) { 993 + const user = await getuser(userid, guildID); 994 + return user.sound; 995 + }, 996 + addSound(userid: string, surl: string | false, guildID: string) { 997 + return joinsound(userid, surl, guildID); 998 + }, 999 + async isBlacklistedUser(userID: string, guildID: string) { 1000 + if (await checks(userID, guildID)) { 1001 + return isBlacklistedUser(userID, guildID); 1002 + } 1003 + return false; 1004 + }, 1005 + setJoinable(guildID: string, channelID: string, insert: boolean) { 1006 + return setJoinChannel(guildID, channelID, insert); 1007 + }, 1008 + isJoinable: async (guildID: string, channelID: string) => { 1009 + const channels = await getJoinChannel(guildID); 1010 + return channels.includes(channelID); 1011 + }, 1012 + setCommandChannel(guildID: string, channelID: string, insert: boolean) { 1013 + return setCommandChannel(guildID, channelID, insert); 1014 + }, 1015 + setAdmin(guildID: string, roleID: string, insert: boolean) { 1016 + return setAdminRole(guildID, roleID, insert); 1017 + }, 1018 + async setBlacklistedUser(guildID: string, userID: string, insert: boolean) { 1019 + if (await checks(userID, guildID)) { 1020 + return setBlacklistedUser(userID, guildID, insert); 1021 + } 1022 + return false; 1023 + }, 1024 + getSettings(guildID: string) { 1025 + return getSettings(guildID); 1026 + }, 1027 + async clrSalt(userid: string, G: Guild) { 1028 + return MongoClient.connect(url).then(async (mclient) => { 1029 + const guildID = G.id; 1030 + const db = mclient.db('MagiBot'); 1031 + await db 1032 + .collection('salt') 1033 + .deleteMany({ guild: guildID, salter: userid }); 1034 + await saltGuild(userid, guildID, 1, true); 1035 + mclient.close(); 1036 + await updateSaltKing(G); 1037 + }); 1038 + }, 1039 + async resetSalt(G: Guild) { 1040 + await MongoClient.connect(url).then(async (mclient) => { 1041 + const guildID = G.id; 1042 + const db = mclient.db('MagiBot'); 1043 + await db.collection('saltrank').deleteMany({ guild: guildID }); 1044 + await db.collection('salt').deleteMany({ guild: guildID }); 1045 + await updateSaltKing(G); 1046 + mclient.close(); 1047 + }); 1048 + }, 1049 + async setNotification(guildID: string, cid: string | false) { 1050 + await setNotChannel(guildID, cid); 1051 + }, 1052 + isNotChannel: async (guildID: string, channID: string) => { 1053 + const notChann = await getNotChannel(guildID); 1054 + return channID === notChann; 1055 + }, 1056 + sendUpdate(update: string, bot: Client) { 1057 + sendUpdate(update, bot); 1058 + }, 1059 + getPrefixE(guildID: string) { 1060 + return getPrefix(guildID); 1061 + }, 1062 + async setPrefixE(guildID: string, pref: string) { 1063 + await setPrefix(guildID, pref); 1064 + PREFIXES[guildID] = pref; 1065 + return pref; 1066 + }, 1067 + async getPrefixesE(bot: Client) { 1068 + resetPrefixes(); 1069 + const guilds = bot.guilds.cache.array(); 1070 + asyncForEach(guilds, async (G) => { 1071 + PREFIXES[G.id] = await getPrefix(G.id); 1072 + }); 1073 + }, 1074 + toggleDBLE(userID: string, add: boolean) { 1075 + toggleDBL(userID, add); 1076 + }, 1077 + getDBLE(userID: string) { 1078 + return isInDBL(userID); 1079 + }, 1080 + addVote(vote) { 1081 + MongoClient.connect(url).then(async (mclient) => { 1082 + const db = mclient.db('MagiBot'); 1083 + db.collection('votes').insertOne(vote); 1084 + mclient.close(); 1085 + }); 1086 + }, 1087 + toggleStillMuted(userID: string, guildID: string, add: boolean) { 1088 + toggleStillMuted(userID, guildID, add); 1089 + }, 1090 + async isStillMuted(userID: string, guildID: string) { 1091 + return MongoClient.connect(url).then(async (mclient) => { 1092 + const db = mclient.db('MagiBot'); 1093 + const find = await db 1094 + .collection('stillMuted') 1095 + .findOne({ userid: userID, guildid: guildID }); 1096 + mclient.close(); 1097 + return find; 1098 + }); 1099 + }, 1100 + async getDBLSubs() { 1101 + return MongoClient.connect(url).then(async (mclient) => { 1102 + const db = mclient.db('MagiBot'); 1103 + const users = await db 1104 + .collection('DBLreminder') 1105 + .find() 1106 + .toArray(); 1107 + mclient.close(); 1108 + return users; 1109 + }); 1110 + }, 1111 + };
+9
src/renameto_token.ts
··· 1 + // access to bot 2 + // rename this file to token.ts 3 + export default { 4 + tk: 'discordbottoken', 5 + owner: 'discordbotownerID', 6 + prefix: 'a', // has to be single char only, otherwise the assumption is false for a lot of functions 7 + dburl: 'databaseurl', 8 + blapis: [], // botlist access token array (format as in BLAPI) 9 + };
+15
src/sendToMyDiscord.ts
··· 1 + // commands made by Basti for use of the Bot 2 + import Discord from 'discord.js'; 3 + import { bot } from './bot'; 4 + 5 + 6 + export async function catchErrorOnDiscord(err) { 7 + try { 8 + const chann = await bot.channels.fetch('414809410448261132'); 9 + if (chann) { 10 + (chann as Discord.TextChannel).send(`Caught error: ${err}`); 11 + } 12 + } catch (error) { 13 + console.error(error); 14 + } 15 + }
+47
src/shared_assets.ts
··· 1 + import Discord, { ClientUser } from 'discord.js'; 2 + import config from './token'; 3 + 4 + export const OWNERID = config.owner; 5 + export const PREFIX = config.prefix; 6 + export const TOKEN = config.tk; 7 + export const DETAILED_LOGGING = false; 8 + export const DELETE_COMMANDS = false; 9 + export const COLOR = 0x351c75; 10 + export const SUCCESS_COLOR = 0x00ff00; 11 + export const ERROR_COLOR = 0x0000ff; 12 + export const INFO_COLOR = 0x0000ff; 13 + export const SIGN = 'MagiBot - created by T0TProduction#0001'; 14 + // eslint-disable-next-line import/no-mutable-exports 15 + export let PREFIXES: { 16 + [k: string]: string; 17 + } = {}; 18 + export const queueVoiceChannels: { [key: string]: string } = {}; 19 + 20 + export function sendNotification( 21 + info: string, 22 + type: string, 23 + msg: Discord.Message, 24 + ) { 25 + let icolor: number | undefined; 26 + 27 + if (type === 'success') icolor = SUCCESS_COLOR; 28 + else if (type === 'error') icolor = ERROR_COLOR; 29 + else if (type === 'info') icolor = INFO_COLOR; 30 + else icolor = COLOR; 31 + 32 + const embed = { 33 + color: icolor, 34 + description: info, 35 + }; 36 + msg.channel.send('', { embed }); 37 + } 38 + let bot_user: ClientUser; 39 + export function setUser(usr: ClientUser) { 40 + bot_user = usr; 41 + } 42 + export function user() { 43 + return bot_user; 44 + } 45 + export function resetPrefixes() { 46 + PREFIXES = {}; 47 + }
+23
src/token.ts
··· 1 + import dotenv from 'dotenv'; 2 + 3 + dotenv.config(); // load .env into environment 4 + 5 + const token = process.env.TOKEN; 6 + const owner = process.env.OWNERID; 7 + const prefix = process.env.PREFIX; 8 + const dburl = process.env.DATABASE_URL; 9 + const blapis = { 10 + 11 + } as { [listname: string]: string }; 12 + 13 + if (!(token && owner && prefix && dburl)) { 14 + throw new Error('Missing .env configuration!'); 15 + } 16 + 17 + export default { 18 + tk: token, 19 + owner, 20 + prefix, 21 + dburl, 22 + blapis, 23 + };
+1
src/types/enums.ts
··· 1 + export enum commandCategories {util='Utility', fun='Fun', game='Game', misc='Miscellaneous'};
+17
src/types/magibot.d.ts
··· 1 + import Discord, { Message } from 'discord.js'; 2 + import { commandCategories } from './enums'; 3 + 4 + declare global { 5 + type magibotCommand = { 6 + name:string; 7 + ehelp: (msg:Message)=>Array<{name:string, value:string}>; 8 + admin: boolean; 9 + hide:boolean; 10 + dev:boolean; 11 + perm: Discord.PermissionResolvable | Discord.PermissionResolvable[]; 12 + category: commandCategories; 13 + main: 14 + | ((content:string, msg: Discord.Message) => Promise<any>) 15 + | ((content:string, msg: Discord.Message) => any); 16 + }; 17 + }
+41
tsconfig.json
··· 1 + { 2 + "include": ["**/*.ts", "**/*.js"], 3 + "exclude": ["node_modules"], 4 + "compilerOptions": { 5 + "target": "esnext", 6 + "module": "commonjs", 7 + // "module": "esnext", // older node.js is not able to use esnext modules 8 + "moduleResolution": "node", 9 + "lib": ["esnext", "esnext.asynciterable", "dom"], 10 + "allowJs": true, 11 + // "checkJs": true, maybe deactivating this allows us to have correct CI whilst porting.. 12 + "sourceMap": true, 13 + "strict": true, 14 + "noImplicitAny": false, 15 + "noEmit": true, 16 + "isolatedModules": true, 17 + "baseUrl": ".src", 18 + "strictNullChecks": true, 19 + // not sure if both of these should be defined: 20 + "typeRoots": ["types", "node_modules/@types"], 21 + "types": ["@types/node"], 22 + "allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, 23 + /* Additional Checks */ 24 + // for now lets keep this out: 25 + // "noUnusedLocals": true /* Report errors on unused locals. */, 26 + // "noUnusedParameters": true /* Report errors on unused parameters. */, 27 + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, 28 + "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, 29 + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, 30 + /* Experimental Options */ 31 + "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, 32 + "outDir": "dist", 33 + /* Module Resolution Options */ 34 + // not sure if this breaks things... 35 + "paths": { 36 + "*": ["node_modules/*"], 37 + "~/*": ["./*"], 38 + "@/*": ["./types/*"] 39 + } /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 40 + } 41 + }