diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 0715471..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Lint -on: [push, pull_request] -jobs: - lint: - name: Lint - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Install Node v12 - uses: actions/setup-node@v1 - with: - node-version: 12 - - - name: Install pnpm - run: curl -L https://unpkg.com/@pnpm/self-installer | node - - - name: Install dependencies - run: pnpm i - - - name: Run Lint - uses: icrawl/action-eslint@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..91d6e5c --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: Testing +on: [push, pull_request] +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Install Node v14 + uses: actions/setup-node@v2 + with: + node-version: 14 + + - name: Install dependencies + run: npm ci + + - name: Run ESLint + run: npm run lint + + - name: Run TSC + run: npm run build diff --git a/.github/workflows/tsc.yml b/.github/workflows/tsc.yml deleted file mode 100644 index 54bc7d5..0000000 --- a/.github/workflows/tsc.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: TSC -on: [push, pull_request] -jobs: - tsc: - name: TSC - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - - name: Install Node v12 - uses: actions/setup-node@v1 - with: - node-version: 12 - - - name: Install pnpm - run: curl -L https://unpkg.com/@pnpm/self-installer | node - - - name: Install dependencies - run: pnpm i - - - name: Run TSC - uses: icrawl/action-tsc@v1 diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..eba3f40 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "printWidth": 120, + "useTabs": true, + "singleQuote": true, + "quoteProps": "as-needed", + "trailingComma": "all", + "endOfLine": "lf" +} diff --git a/LICENSE b/LICENSE index 452dcb6..b0705c1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2017-2020 iCrawl +Copyright (c) 2017-2021 iCrawl Copyright (c) 2017-2019 Khinenw Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/README.md b/README.md index 66263a6..cde11bd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Discord Presence + > Update your discord status with the newly added rich presence.
@@ -14,19 +15,20 @@ ## Features -* Shows what you are editing in VSCode with no bullsh*t involved -* Support for over 130 of the most popular languages -* Enable/Disable Rich Presence for individual workspaces (enabled by default) -* Custom string support -* Respects Discords 15sec limit when it comes to updating your status -* Stable or Insiders build detection -* Debug mode detection -* Easily manually reconnect to Discord -* VSCode Live Share support +- Shows what you are editing in VSCode with no bullsh\*t involved +- Support for over 130 of the most popular languages +- Enable/Disable Rich Presence for individual workspaces (enabled by default) +- Custom string support +- Respects Discords 15sec limit when it comes to updating your status +- Stable or Insiders build detection +- Debug mode detection +- Easily manually reconnect to Discord +- VSCode Live Share support ## Troubleshooting -### Can't connect to Discord? Check those: +### Can't connect to Discord? Check those: + https://github.com/iCrawl/discord-vscode/issues/77#issuecomment-435622205 https://github.com/iCrawl/discord-vscode/issues/85#issuecomment-417895483 diff --git a/package-lock.json b/package-lock.json index 2e7c0ab..e2c9cd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,3171 @@ { "name": "discord-vscode", - "version": "4.1.0", - "lockfileVersion": 1, + "version": "5.0.0", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "bufferutil": "^4.0.3", + "dayjs": "^1.10.4", + "discord-rpc": "github:discordjs/RPC", + "tslib": "^2.1.0", + "utf-8-validate": "^5.0.4" + }, + "devDependencies": { + "@types/node": "^14.14.25", + "@types/vscode": "^1.53.0", + "@typescript-eslint/eslint-plugin": "^4.15.0", + "@typescript-eslint/parser": "^4.15.0", + "clean-webpack-plugin": "^3.0.0", + "eslint": "^7.19.0", + "eslint-config-marine": "^8.1.0", + "eslint-config-prettier": "^7.2.0", + "eslint-plugin-prettier": "^3.3.1", + "prettier": "^2.2.1", + "terser-webpack-plugin": "^5.1.1", + "ts-loader": "^8.0.16", + "typescript": "^4.1.4", + "webpack": "^5.21.2", + "webpack-cli": "^4.5.0" + }, + "engines": { + "vscode": "^1.53.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.6.tgz", + "integrity": "sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz", + "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", + "dev": true + }, + "node_modules/@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "dependencies": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", + "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==", + "dev": true + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz", + "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.9.2.tgz", + "integrity": "sha512-d6dIfpPbF+8B7WiCi2ELY7m0w1joD8cRW4ms88Emdb2w062NeEpbNCeWwVCgzLRpVG+5e74VFSg4rgJ2xXjEiQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/vscode": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.53.0.tgz", + "integrity": "sha512-XjFWbSPOM0EKIT2XhhYm3D3cx3nn3lshMUcWNy1eqefk+oqRuBq8unVb6BYIZqXy9lQZyeUl7eaBCOZWv+LcXQ==", + "dev": true + }, + "node_modules/@types/webpack": { + "version": "4.41.13", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.13.tgz", + "integrity": "sha512-RYmIHOWSxnTTa765N6jJBVE45pd2SYNblEYshVDduLw6RhocazNmRzE5/ytvBD8IkDMH6DI+bcrqxh8NILimBA==", + "dev": true, + "dependencies": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz", + "integrity": "sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.0.tgz", + "integrity": "sha512-DJgdGZW+8CFUTz5C/dnn4ONcUm2h2T0itWD85Ob5/V27Ndie8hUoX5HKyGssvR8sUMkAIlUc/AMK67Lqa3kBIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.15.0", + "@typescript-eslint/scope-manager": "4.15.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.0.tgz", + "integrity": "sha512-V4vaDWvxA2zgesg4KPgEGiomWEBpJXvY4ZX34Y3qxK8LUm5I87L+qGIOTd9tHZOARXNRt9pLbblSKiYBlGMawg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.15.0", + "@typescript-eslint/types": "4.15.0", + "@typescript-eslint/typescript-estree": "4.15.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.15.0.tgz", + "integrity": "sha512-L6Dtbq8Bc7g2aZwnIBETpmUa9XDKCMzKVwAArnGp5Mn7PRNFjf3mUzq8UeBjL3K8t311hvevnyqXAMSmxO8Gpg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.15.0", + "@typescript-eslint/types": "4.15.0", + "@typescript-eslint/typescript-estree": "4.15.0", + "debug": "^4.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.15.0.tgz", + "integrity": "sha512-CSNBZnCC2jEA/a+pR9Ljh8Y+5TY5qgbPz7ICEk9WCpSEgT6Pi7H2RIjxfrrbUXvotd6ta+i27sssKEH8Azm75g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.0", + "@typescript-eslint/visitor-keys": "4.15.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.15.0.tgz", + "integrity": "sha512-su4RHkJhS+iFwyqyXHcS8EGPlUVoC+XREfy5daivjLur9JP8GhvTmDipuRpcujtGC4M+GYhUOJCPDE3rC5NJrg==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.0.tgz", + "integrity": "sha512-jG6xTmcNbi6xzZq0SdWh7wQ9cMb2pqXaUp6bUZOMsIlu5aOlxGxgE/t6L/gPybybQGvdguajXGkZKSndZJpksA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.0", + "@typescript-eslint/visitor-keys": "4.15.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.0.tgz", + "integrity": "sha512-RnDtJwOwFucWFAMjG3ghCG/ikImFJFEg20DI7mn4pHEx3vC48lIAoyjhffvfHmErRDboUPC7p9Z2il4CLb7qxA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.15.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz", + "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz", + "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz", + "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz", + "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz", + "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz", + "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz", + "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz", + "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz", + "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz", + "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz", + "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/helper-wasm-section": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-opt": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "@webassemblyjs/wast-printer": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz", + "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz", + "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-buffer": "1.11.0", + "@webassemblyjs/wasm-gen": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz", + "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/helper-api-error": "1.11.0", + "@webassemblyjs/helper-wasm-bytecode": "1.11.0", + "@webassemblyjs/ieee754": "1.11.0", + "@webassemblyjs/leb128": "1.11.0", + "@webassemblyjs/utf8": "1.11.0" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz", + "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "dev": true + }, + "node_modules/@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "dev": true + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001185", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", + "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chrome-trace-event/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/clean-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==", + "dev": true, + "dependencies": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dayjs": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", + "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" + }, + "node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/discord-rpc": { + "resolved": "git+ssh://git@github.com/discordjs/RPC.git#cbdd31f98b20de0222a793ae0b14018f8119cfb2", + "dependencies": { + "node-fetch": "^2.6.1", + "ws": "^7.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.657", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.657.tgz", + "integrity": "sha512-/9ROOyvEflEbaZFUeGofD+Tqs/WynbSTbNgNF+/TJJxH1ePD/e6VjZlDJpW3FFFd3nj5l3Hd8ki2vRwy+gyRFw==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-module-lexer": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", + "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.3.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-aqua": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-aqua/-/eslint-config-aqua-8.0.0.tgz", + "integrity": "sha512-TKvuVmjsb9b31dAWDptI9vY2DlUGidhL2slX20GZtnWALRdoH8cjSOeLpDF2H+yU+wSVDL/Ni0oFWPaG8L8lWA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-config-marine": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-marine/-/eslint-config-marine-8.1.0.tgz", + "integrity": "sha512-BSYZe12AZoOi83Up2KhfmvVRzaqgMIgTC8q73/M8AvL/bsLxi3cz0hNKPx+NL9KHFeopGaaGiE3h0o/fXBdFCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-config-aqua": "^8.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.9.0.tgz", + "integrity": "sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dev": true, + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "dependencies": { + "ajv": "^7.0.2", + "lodash": "^4.17.20", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", + "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==", + "dev": true, + "dependencies": { + "jest-worker": "^26.6.2", + "p-limit": "^3.1.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.5.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-loader": { + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.16.tgz", + "integrity": "sha512-Cr9ywsgg1n8cjGjIogHLPlqe3WJUHzuJaqwNo5I596KpIqekKzxvSENbrXeOypHcXSPPsr8hV6mglngyXvcKrg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^2.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ts-loader/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" + }, + "node_modules/tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/typescript": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.4.tgz", + "integrity": "sha512-+Uru0t8qIRgjuCpiSPpfGuhHecMllk5Zsazj5LZvVsEStEjmIRRBZe+jHjGQvsgS7M1wONy2PQXd67EMyV6acg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", + "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.2.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.21.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.21.2.tgz", + "integrity": "sha512-xHflCenx+AM4uWKX71SWHhxml5aMXdy2tu/vdi4lClm7PADKxlyDAFFN1rEFzNV0MAoPpHtBeJnl/+K6F4QBPg==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.46", + "@webassemblyjs/ast": "1.11.0", + "@webassemblyjs/wasm-edit": "1.11.0", + "@webassemblyjs/wasm-parser": "1.11.0", + "acorn": "^8.0.4", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.3.26", + "eslint-scope": "^5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.0.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.1", + "watchpack": "^2.0.0", + "webpack-sources": "^2.1.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz", + "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.1.tgz", + "integrity": "sha512-pTsP8UAfhy3sk1lSk/O/s4tjD0CRwvMnzvwr4OKGX7ZvqZtUyx4KIJB5JWbkykPoc55tixMGgTNoh3k4FkNGFQ==", + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", @@ -67,18 +3230,6 @@ "strip-json-comments": "^3.1.1" } }, - "@microsoft/servicehub-framework": { - "version": "2.6.74", - "resolved": "https://registry.npmjs.org/@microsoft/servicehub-framework/-/servicehub-framework-2.6.74.tgz", - "integrity": "sha512-QJ//zzvxffupIkzupnVbMYY5YDOP+g5FlG6x0Pl7svRyq8pAouiibckJJcZlMtsMypKWwAnVBKb9/sonEOsUxw==", - "requires": { - "await-semaphore": "^0.1.3", - "msgpack-lite": "^0.1.26", - "nerdbank-streams": "2.5.60", - "strict-event-emitter-types": "^2.0.0", - "vscode-jsonrpc": "^4.0.0" - } - }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -603,11 +3754,6 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, - "await-semaphore": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/await-semaphore/-/await-semaphore-0.1.3.tgz", - "integrity": "sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q==" - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -672,22 +3818,12 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "cancellationtoken": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/cancellationtoken/-/cancellationtoken-2.0.1.tgz", - "integrity": "sha512-FVCOyTdjFtlhOHaF0R7PAOL0btq+dyhXUvIGtvJ7pr4wd4R31mdlX3ODTDaVk5R08+Fm+MSHwGA5BJH99sNYdQ==" - }, "caniuse-lite": { "version": "1.0.30001185", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==", "dev": true }, - "caught": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/caught/-/caught-0.1.3.tgz", - "integrity": "sha512-DTWI84qfoqHEV5jHRpsKNnEisVCeuBDscXXaXyRLXC+4RD6rFftUNuTElcQ7LeO7w622pfzWkA1f6xu5qEAidw==" - }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -827,6 +3963,11 @@ "which": "^2.0.1" } }, + "dayjs": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", + "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -867,8 +4008,8 @@ } }, "discord-rpc": { - "version": "github:discordjs/RPC#cbdd31f98b20de0222a793ae0b14018f8119cfb2", - "from": "github:discordjs/RPC#cbdd31f98b20de0222a793ae0b14018f8119cfb2", + "version": "git+ssh://git@github.com/discordjs/RPC.git#cbdd31f98b20de0222a793ae0b14018f8119cfb2", + "from": "discord-rpc@github:discordjs/RPC", "requires": { "node-fetch": "^2.6.1", "ws": "^7.3.1" @@ -1008,18 +4149,18 @@ } }, "eslint-config-aqua": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-aqua/-/eslint-config-aqua-7.3.0.tgz", - "integrity": "sha512-rSOMrG5fpv/DtITtGKeOwTWYMeLiCaNLIsJlLABp2oeDs4qTaIE4Y3UdWc/10/C7Vuy/aNGiOidb/XAa6veFFg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-aqua/-/eslint-config-aqua-8.0.0.tgz", + "integrity": "sha512-TKvuVmjsb9b31dAWDptI9vY2DlUGidhL2slX20GZtnWALRdoH8cjSOeLpDF2H+yU+wSVDL/Ni0oFWPaG8L8lWA==", "dev": true }, "eslint-config-marine": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-marine/-/eslint-config-marine-7.2.0.tgz", - "integrity": "sha512-emIoQpexPl5Of4d/qZ+lf91JObvnJefGdsuNUQWH8p2E7iSSw8nQmOSocVdEUWjZoTzhf1z0x/UP4g9g6S2Kdw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-marine/-/eslint-config-marine-8.1.0.tgz", + "integrity": "sha512-BSYZe12AZoOi83Up2KhfmvVRzaqgMIgTC8q73/M8AvL/bsLxi3cz0hNKPx+NL9KHFeopGaaGiE3h0o/fXBdFCQ==", "dev": true, "requires": { - "eslint-config-aqua": "^7.3.0" + "eslint-config-aqua": "^8.0.0" } }, "eslint-config-prettier": { @@ -1125,11 +4266,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-lite": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.2.tgz", - "integrity": "sha512-HnSYx1BsJ87/p6swwzv+2v6B4X+uxUteoDfRxsAb1S1BePzQqOLevVmkdA15GHJVd9A9Ok6wygUR18Hu0YeV9g==" - }, "events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -1371,11 +4507,6 @@ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -1424,11 +4555,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "int64-buffer": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", - "integrity": "sha1-J3siiofZWtd30HwTgyAiQGpHNCM=" - }, "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -1513,7 +4639,8 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -1729,17 +4856,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "msgpack-lite": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", - "integrity": "sha1-3TxQsm8FnyXn7e42REGDWOKprYk=", - "requires": { - "event-lite": "^0.1.1", - "ieee754": "^1.1.8", - "int64-buffer": "^0.1.9", - "isarray": "^1.0.0" - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -1752,17 +4868,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "nerdbank-streams": { - "version": "2.5.60", - "resolved": "https://registry.npmjs.org/nerdbank-streams/-/nerdbank-streams-2.5.60.tgz", - "integrity": "sha512-saQaMyTtVDAEc+S+BPXKM6K1AF3FyrorFSDzaCkdmtDe2kZzu1aYPQZNLmnxJhxbTcghYrEmYFFoaDxBDVadCw==", - "requires": { - "await-semaphore": "^0.1.3", - "cancellationtoken": "^2.0.1", - "caught": "^0.1.3", - "msgpack-lite": "^0.1.26" - } - }, "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", @@ -2225,10 +5330,14 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "strict-event-emitter-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", - "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==" + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, "string-width": { "version": "4.2.0", @@ -2241,15 +5350,6 @@ "strip-ansi": "^6.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -2462,19 +5562,6 @@ "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", "dev": true }, - "vscode-jsonrpc": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", - "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" - }, - "vsls": { - "version": "1.0.3015", - "resolved": "https://registry.npmjs.org/vsls/-/vsls-1.0.3015.tgz", - "integrity": "sha512-c+hG4X/aNdR4PM2nxUeooTEyDav8TQ8exfLSWIWp+h+us1jjhxGk2K+PDCrJxJmeIra/Ku4sdqMRv7P9hF6MRA==", - "requires": { - "@microsoft/servicehub-framework": "^2.6.74" - } - }, "watchpack": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", diff --git a/package.json b/package.json index ba25012..20c8c7c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "discord-vscode", "displayName": "Discord Presence", - "version": "4.1.0", + "version": "5.0.0", "description": "Update your discord status with the newly added rich presence.", "private": true, "author": { @@ -20,7 +20,6 @@ "scripts": { "prebuild": "npm run lint", "build": "webpack --mode production", - "tsc": "tsc", "lint": "eslint src --ext .ts", "lint:fix": "eslint src --ext .ts --fix" }, @@ -34,42 +33,22 @@ "commands": [ { "command": "discord.enable", - "title": "Enable Discord Presence in the Current Workspace", + "title": "Enable Discord Presence in the current workspace", "category": "Discord Presence" }, { "command": "discord.disable", - "title": "Disable Discord Presence in the Current Workspace", + "title": "Disable Discord Presence in the current workspace", "category": "Discord Presence" }, { "command": "discord.reconnect", - "title": "Reconnect Discord Presence to Discord RPC", + "title": "Reconnect Discord Presence to Discord", "category": "Discord Presence" }, { "command": "discord.disconnect", - "title": "Disconnect Discord Presence from Discord RPC", - "category": "Discord Presence" - }, - { - "command": "discord.allowSpectate", - "title": "Allow Spectating", - "category": "Discord Presence" - }, - { - "command": "discord.disableSpectate", - "title": "Disable Spectating", - "category": "Discord Presence" - }, - { - "command": "discord.allowJoinRequests", - "title": "Allow Join Requests", - "category": "Discord Presence" - }, - { - "command": "discord.disableJoinRequests", - "title": "Disable Join Requests", + "title": "Disconnect Discord Presence from Discord", "category": "Discord Presence" } ], @@ -83,67 +62,67 @@ "default": true, "description": "Controls if the Discord Presence should show across all workspaces" }, - "discord.detailsEditing": { - "type": "string", - "default": "Editing {filename}", - "description": "Custom string for the details section of the rich presence\n\t- '{null}' will be replaced with an empty space.\n\t- '{filename}' will be replaced with the current file name.\n\t- '{dirname}' will get replaced with the folder name that has the current file.\n\t- '{fulldirname}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspaceFolder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspaceAndFolder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{currentcolumn}' will get replaced with the current column of the current line.\n\t- '{currentline}' will get replaced with the current line number.\n\t- '{totallines}' will get replaced with the total line number.\n\t- '{filesize}' will get replaced with the current file's size.\n\t- '{gitreponame}' will be replaced with the active Git repository name (from the git URL)\n\t- '{gitbranch}' will be replaced with the current active branch name." - }, - "discord.detailsDebugging": { - "type": "string", - "default": "Debugging {filename}", - "description": "Custom string for the details section of the rich presence when debugging\n\t- '{null}' will be replaced with an empty space.\n\t- '{filename}' will be replaced with the current file name.\n\t- '{dirname}' will get replaced with the folder name that has the current file.\n\t- '{fulldirname}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspaceFolder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspaceAndFolder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{currentcolumn}' will get replaced with the current column of the current line.\n\t- '{currentline}' will get replaced with the current line number.\n\t- '{totallines}' will get replaced with the total line number.\n\t- '{filesize}' will get replaced with the current file's size.\n\t- '{gitreponame}' will be replaced with the active Git repository name (from the git URL)\n\t- '{gitbranch}' will be replaced with the current active branch name." - }, - "discord.detailsIdle": { + "discord.details_idling": { "type": "string", "default": "Idling", - "description": "Custom string for the details section of the rich presence when idling\n\t- '{null}' will be replaced with an empty space." + "description": "Custom string for the details section of the rich presence when idling\n\t- '{empty}' will be replaced with an empty space." }, - "discord.lowerDetailsEditing": { + "discord.details_editing": { + "type": "string", + "default": "Editing {file_name}", + "description": "Custom string for the details section of the rich presence\n\t- '{empty}' will be replaced with an empty space.\n\t- '{file_name}' will be replaced with the current file name.\n\t- '{dir_name}' will get replaced with the folder name that has the current file.\n\t- '{full_dir_name}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspace_folder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspace_and_folder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{current_column}' will get replaced with the current column of the current line.\n\t- '{current_line}' will get replaced with the current line number.\n\t- '{total_lines}' will get replaced with the total line number.\n\t- '{file_size}' will get replaced with the current file's size.\n\t- '{git_repo_name}' will be replaced with the active Git repository name (from the git URL)\n\t- '{git_branch}' will be replaced with the current active branch name." + }, + "discord.details_debugging": { + "type": "string", + "default": "Debugging {file_name}", + "description": "Custom string for the details section of the rich presence when debugging\n\t- '{empty}' will be replaced with an empty space.\n\t- '{file_name}' will be replaced with the current file name.\n\t- '{dir_name}' will get replaced with the folder name that has the current file.\n\t- '{full_dir_name}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspace_folder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspace_and_folder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{current_column}' will get replaced with the current column of the current line.\n\t- '{current_line}' will get replaced with the current line number.\n\t- '{total_lines}' will get replaced with the total line number.\n\t- '{file_size}' will get replaced with the current file's size.\n\t- '{git_repo_name}' will be replaced with the active Git repository name (from the git URL)\n\t- '{git_branch}' will be replaced with the current active branch name." + }, + "discord.lower_details_idling": { + "type": "string", + "default": "Idling", + "description": "Custom string for the state section of the rich presence when idling\n\t- '{empty}' will be replaced with an empty space." + }, + "discord.lower_details_editing": { "type": "string", "default": "Workspace: {workspace}", - "description": "Custom string for the state section of the rich presence\n\t- '{null}' will be replaced with an empty space.\n\t- '{filename}' will be replaced with the current file name.\n\t- '{dirname}' will get replaced with the folder name that has the current file.\n\t- '{fulldirname}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspaceFolder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspaceAndFolder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{currentcolumn}' will get replaced with the current column of the current line.\n\t- '{currentline}' will get replaced with the current line number.\n\t- '{totallines}' will get replaced with the total line number.\n\t- '{filesize}' will get replaced with the current file's size.\n\t- '{gitreponame}' will be replaced with the active Git repository name (from the git URL)\n\t- '{gitbranch}' will be replaced with the current active branch name." + "description": "Custom string for the state section of the rich presence\n\t- '{empty}' will be replaced with an empty space.\n\t- '{file_name}' will be replaced with the current file name.\n\t- '{dir_name}' will get replaced with the folder name that has the current file.\n\t- '{full_dir_name}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspace_folder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspace_and_folder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{current_column}' will get replaced with the current column of the current line.\n\t- '{current_line}' will get replaced with the current line number.\n\t- '{total_lines}' will get replaced with the total line number.\n\t- '{file_size}' will get replaced with the current file's size.\n\t- '{git_repo_name}' will be replaced with the active Git repository name (from the git URL)\n\t- '{git_branch}' will be replaced with the current active branch name." }, - "discord.lowerDetailsDebugging": { + "discord.lower_details_debugging": { "type": "string", "default": "Debugging: {workspace}", - "description": "Custom string for the state section of the rich presence when debugging\n\t- '{null}' will be replaced with an empty space.\n\t- '{filename}' will be replaced with the current file name.\n\t- '{dirname}' will get replaced with the folder name that has the current file.\n\t- '{fulldirname}' will get replaced with the full directory name without the current file name..\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspaceFolder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspaceAndFolder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{currentcolumn}' will get replaced with the current column of the current line.\n\t- '{currentline}' will get replaced with the current line number.\n\t- '{totallines}' will get replaced with the total line number.\n\t- '{filesize}' will get replaced with the current file's size.\n\t- '{gitreponame}' will be replaced with the active Git repository name (from the git URL)\n\t- '{gitbranch}' will be replaced with the current active branch name." + "description": "Custom string for the state section of the rich presence when debugging\n\t- '{empty}' will be replaced with an empty space.\n\t- '{file_name}' will be replaced with the current file name.\n\t- '{dir_name}' will get replaced with the folder name that has the current file.\n\t- '{full_dir_name}' will get replaced with the full directory name without the current file name.\n\t- '{workspace}' will be replaced with the current workspace name, if any.\n\t- '{workspace_folder}' will be replaced with the currently accessed workspace folder, if any.\n\t- '{workspace_and_folder} will be replaced with the currently accessed workspace and workspace folder like this: 'Workspace - WorkspaceFolder'\n\t- '{current_column}' will get replaced with the current column of the current line.\n\t- '{current_line}' will get replaced with the current line number.\n\t- '{total_lines}' will get replaced with the total line number.\n\t- '{file_size}' will get replaced with the current file's size.\n\t- '{git_repo_name}' will be replaced with the active Git repository name (from the git URL)\n\t- '{git_branch}' will be replaced with the current active branch name." }, - "discord.lowerDetailsIdle": { - "type": "string", - "default": "Idling", - "description": "Custom string for the state section of the rich presence when idling\n\t- '{null}' will be replaced with an empty space." - }, - "discord.lowerDetailsNotFound": { + "discord.lower_details_no_workspace_found": { "type": "string", "default": "No workspace.", - "description": "Custom string for the state section of the rich presence when no workspace is found.\nIf set to '{null}', this will be an empty space.\n\t- '{currentline}' will get replaced with the current line number.\n\t- '{totallines}' will get replaced with the total line number.\n\t- '{filesize}' will get replaced with the current file's size." + "description": "Custom string for the state section of the rich presence when no workspace is found.\nIf set to '{empty}', this will be an empty space.\n\t- '{current_line}' will get replaced with the current line number.\n\t- '{total_lines}' will get replaced with the total line number.\n\t- '{file_size}' will get replaced with the current file's size." }, - "discord.largeImage": { - "type": "string", - "default": "Editing a {LANG} file", - "description": "Custom string for the largeImageText section of the rich presence.\n\t- '{lang}' will be replaced with the lowercased language ID\n\t- '{LANG}' will be replaced with the uppercased language ID" - }, - "discord.largeImageIdle": { + "discord.large_image_idling": { "type": "string", "default": "Idling", "description": "Custom string for the largeImageText section of the rich presence when idling" }, - "discord.smallImage": { + "discord.large_image": { "type": "string", - "default": "{appname}", - "description": "Custom string for the smallImageText section of the rich presence\n\t- '{appname}' will get replaced with the current Visual Studio Code version." + "default": "Editing a {LANG} file", + "description": "Custom string for the largeImageText section of the rich presence.\n\t- '{lang}' will be replaced with the lowercased language ID\n\t- '{LANG}' will be replaced with the uppercased language ID" }, - "discord.silent": { + "discord.small_image": { + "type": "string", + "default": "{app_name}", + "description": "Custom string for the smallImageText section of the rich presence\n\t- '{app_name}' will get replaced with the current Visual Studio Code version." + }, + "discord.suppress_notifications": { "type": "boolean", "default": false, "description": "Decides if error messages are shown to the user" }, - "discord.workspaceElapsedTime": { + "discord.workspace_elapsed_time": { "type": "boolean", - "default": false, + "default": true, "description": "Decides whether to display elapsed time for a workspace or a single file" }, - "discord.workspaceExcludePatterns": { + "discord.workspace_exclude_patterns": { "type": "array", "items": { "type": "string" @@ -181,10 +160,10 @@ }, "dependencies": { "bufferutil": "^4.0.3", + "dayjs": "^1.10.4", "discord-rpc": "github:discordjs/RPC", "tslib": "^2.1.0", - "utf-8-validate": "^5.0.4", - "vsls": "^1.0.3015" + "utf-8-validate": "^5.0.4" }, "devDependencies": { "@types/node": "^14.14.25", @@ -193,7 +172,7 @@ "@typescript-eslint/parser": "^4.15.0", "clean-webpack-plugin": "^3.0.0", "eslint": "^7.19.0", - "eslint-config-marine": "^7.2.0", + "eslint-config-marine": "^8.1.0", "eslint-config-prettier": "^7.2.0", "eslint-plugin-prettier": "^3.3.1", "prettier": "^2.2.1", @@ -204,6 +183,6 @@ "webpack-cli": "^4.5.0" }, "engines": { - "vscode": "^1.51.0" + "vscode": "^1.53.0" } } diff --git a/src/activity.ts b/src/activity.ts new file mode 100644 index 0000000..41cd962 --- /dev/null +++ b/src/activity.ts @@ -0,0 +1,193 @@ +import { basename, parse, sep } from 'path'; +import { debug, env, extensions, Selection, TextDocument, window, workspace } from 'vscode'; + +import { + CONFIG_KEYS, + DEBUG_IMAGE_KEY, + EMPTY, + FILE_SIZES, + IDLE_IMAGE_KEY, + REPLACE_KEYS, + VSCODE_IMAGE_KEY, + VSCODE_INSIDERS_IMAGE_KEY, +} from './constants'; +import { GitExtension } from './git'; +import { log, LogLevel } from './logger'; +import { getConfig, resolveFileIcon, toLower, toTitle, toUpper } from './util'; + +interface ActivityPayload { + details: string; + state?: string; + startTimestamp?: number | null; + largeImageKey?: string; + largeImageText?: string; + smallImageKey?: string; + smallImageText?: string; + partyId?: string; + partySize?: number; + partyMax?: number; + matchSecret?: string; + joinSecret?: string; + spectateSecret?: string; + instance?: boolean; +} + +export async function activity() { + const config = getConfig(); + + const appName = env.appName; + const defaultSmallImageKey = debug.activeDebugSession + ? DEBUG_IMAGE_KEY + : appName.includes('Insiders') + ? VSCODE_INSIDERS_IMAGE_KEY + : VSCODE_IMAGE_KEY; + + let state: ActivityPayload = { + details: await details(CONFIG_KEYS.DetailsIdling, CONFIG_KEYS.DetailsEditing, CONFIG_KEYS.DetailsDebugging), + state: await details( + CONFIG_KEYS.LowerDetailsIdling, + CONFIG_KEYS.LowerDetailsEditing, + CONFIG_KEYS.LowerDetailsDebugging, + ), + startTimestamp: null, + largeImageKey: IDLE_IMAGE_KEY, + largeImageText: config[CONFIG_KEYS.LargeImageIdling], + smallImageKey: defaultSmallImageKey, + smallImageText: config[CONFIG_KEYS.SmallImage].replace(REPLACE_KEYS.AppName, appName), + }; + + if (window.activeTextEditor) { + const largeImageKey = resolveFileIcon(window.activeTextEditor.document); + const largeImageText = config[CONFIG_KEYS.LargeImage] + .replace(REPLACE_KEYS.LanguageLowerCase, toLower(largeImageKey)) + .replace(REPLACE_KEYS.LanguageTitleCase, toTitle(largeImageKey)) + .replace(REPLACE_KEYS.LanguageUpperCase, toUpper(largeImageKey)) + .padEnd(2, EMPTY); + + state = { + ...state, + details: await details(CONFIG_KEYS.DetailsIdling, CONFIG_KEYS.DetailsEditing, CONFIG_KEYS.DetailsDebugging), + state: await details( + CONFIG_KEYS.LowerDetailsIdling, + CONFIG_KEYS.LowerDetailsEditing, + CONFIG_KEYS.LowerDetailsDebugging, + ), + largeImageKey, + largeImageText, + }; + } + + log(LogLevel.Debug, JSON.stringify(state, null, 2)); + + return state; +} + +async function details(idling: CONFIG_KEYS, editing: CONFIG_KEYS, debugging: CONFIG_KEYS) { + const config = getConfig(); + let raw = (config[idling] as string).replace(REPLACE_KEYS.Empty, EMPTY); + + if (window.activeTextEditor) { + const fileName = basename(window.activeTextEditor.document.fileName); + const { dir } = parse(window.activeTextEditor.document.fileName); + const split = dir.split(sep); + const dirName = split[split.length - 1]; + + const noWorkspaceFound = config[CONFIG_KEYS.LowerDetailsNoWorkspaceFound].replace(REPLACE_KEYS.Empty, EMPTY); + const workspaceFolder = workspace.getWorkspaceFolder(window.activeTextEditor.document.uri); + const workspaceFolderName = workspaceFolder?.name ?? noWorkspaceFound; + const workspaceName = workspace.name ?? workspaceFolderName; + const workspaceAndFolder = `${workspaceName}${workspaceFolderName === EMPTY ? '' : ` - ${workspaceFolderName}`}`; + + const fileIcon = resolveFileIcon(window.activeTextEditor.document); + + if (debug.activeDebugSession) { + raw = config[debugging] as string; + } else { + raw = config[editing] as string; + } + + if (workspaceFolder) { + const { name } = workspaceFolder; + const relativePath = workspace.asRelativePath(window.activeTextEditor.document.fileName).split(sep); + relativePath.splice(-1, 1); + raw = raw.replace(REPLACE_KEYS.FullDirName, `${name}${sep}${relativePath.join(sep)}`); + } + + raw = await fileDetails(raw, window.activeTextEditor.document, window.activeTextEditor.selection); + raw = raw + .replace(REPLACE_KEYS.FileName, fileName) + .replace(REPLACE_KEYS.DirName, dirName) + .replace(REPLACE_KEYS.Workspace, workspaceName) + .replace(REPLACE_KEYS.WorkspaceFolder, workspaceFolderName) + .replace(REPLACE_KEYS.WorkspaceAndFolder, workspaceAndFolder) + .replace(REPLACE_KEYS.LanguageLowerCase, toLower(fileIcon)) + .replace(REPLACE_KEYS.LanguageTitleCase, toTitle(fileIcon)) + .replace(REPLACE_KEYS.LanguageUpperCase, toUpper(fileIcon)); + } + + return raw; +} + +async function fileDetails(_raw: string, document: TextDocument, selection: Selection) { + let raw = _raw.slice(); + const gitExtension = extensions.getExtension('vscode.git'); + const git = gitExtension?.exports.getAPI(1); + + if (raw.includes(REPLACE_KEYS.TotalLines)) { + raw = raw.replace(REPLACE_KEYS.TotalLines, document.toLocaleString()); + } + + if (raw.includes(REPLACE_KEYS.CurrentLine)) { + raw = raw.replace(REPLACE_KEYS.CurrentLine, (selection.active.line + 1).toLocaleString()); + } + + if (raw.includes(REPLACE_KEYS.CurrentColumn)) { + raw = raw.replace(REPLACE_KEYS.CurrentColumn, (selection.active.character + 1).toLocaleString()); + } + + if (raw.includes(REPLACE_KEYS.FileSize)) { + let currentDivision = 0; + let { size } = await workspace.fs.stat(document.uri); + const originalSize = size; + if (originalSize > 1000) { + size /= 1000; + currentDivision++; + while (size > 1000) { + currentDivision++; + size /= 1000; + } + } + + raw = raw.replace( + REPLACE_KEYS.FileSize, + `${originalSize > 1000 ? size.toFixed(2) : size}${FILE_SIZES[currentDivision]}`, + ); + } + + if (raw.includes(REPLACE_KEYS.GitBranch)) { + if (git?.repositories.length) { + raw = raw.replace( + REPLACE_KEYS.GitBranch, + git.repositories.find((repo) => repo.ui.selected)?.state.HEAD?.name ?? EMPTY, + ); + } else { + raw = raw.replace(REPLACE_KEYS.GitBranch, 'Unknown'); + } + } + + if (raw.includes(REPLACE_KEYS.GitRepoName)) { + if (git?.repositories.length) { + raw = raw.replace( + REPLACE_KEYS.GitRepoName, + git.repositories + .find((repo) => repo.ui.selected) + ?.state.remotes[0].fetchUrl?.split('/')[1] + .replace('.git', '') ?? EMPTY, + ); + } else { + raw = raw.replace(REPLACE_KEYS.GitRepoName, 'Unknown'); + } + } + + return raw; +} diff --git a/src/client/RPCClient.ts b/src/client/RPCClient.ts deleted file mode 100644 index 28209b8..0000000 --- a/src/client/RPCClient.ts +++ /dev/null @@ -1,172 +0,0 @@ -const { Client } = require('discord-rpc'); // eslint-disable-line -import { Disposable, StatusBarItem, Uri, window, workspace, env } from 'vscode'; -import * as vsls from 'vsls'; -import Activity from '../structures/Activity'; -import Logger from '../structures/Logger'; -import { API } from '../git'; - -let activityTimer: NodeJS.Timer | undefined; - -export default class RPCClient implements Disposable { - public config = workspace.getConfiguration('discord'); - - public git?: API; - - private rpc: any; - - private readonly activity = new Activity(this); - - public constructor(private readonly clientId: string, public statusBarIcon: StatusBarItem) {} - - public get client() { - return this.rpc; - } - - public async setActivity(workspaceElapsedTime = false) { - if (!this.rpc) return; - const activity = await this.activity.generate(workspaceElapsedTime); - if (!activity) return; - Logger.log('Sending activity to Discord.'); - this.rpc.setActivity(activity); - } - - public allowSpectate() { - if (!this.rpc) return; - Logger.log('Allowed spectating.'); - Logger.log('Sending spectate activity to Discord.'); - void this.activity.allowSpectate(); - } - - public disableSpectate() { - if (!this.rpc) return; - Logger.log('Disabled spectating.'); - void this.activity.disableSpectate(); - } - - public allowJoinRequests() { - if (!this.rpc) return; - Logger.log('Allowed join requests.'); - Logger.log('Sending join activity to Discord.'); - void this.activity.allowJoinRequests(); - } - - public disableJoinRequests() { - if (!this.rpc) return; - Logger.log('Disabled join requests.'); - void this.activity.disableJoinRequests(); - } - - public async login() { - if (this.rpc) { - this.dispose(); - } - this.rpc = new Client({ transport: 'ipc' }); - - Logger.log('Logging into RPC...'); - - this.rpc.transport.once('close', () => { - if (!this.config.get('enabled')) return; - void this.dispose(); - this.statusBarIcon.text = '$(plug) Reconnect to Discord'; - this.statusBarIcon.command = 'discord.reconnect'; - this.statusBarIcon.tooltip = ''; - }); - - this.rpc.once('ready', async () => { - Logger.log('Successfully connected to Discord.'); - - this.statusBarIcon.text = '$(globe) Connected to Discord'; - this.statusBarIcon.tooltip = 'Connected to Discord'; - - setTimeout(() => (this.statusBarIcon.text = '$(globe)'), 5000); - - if (activityTimer) clearInterval(activityTimer); - void this.setActivity(this.config.get('workspaceElapsedTime')); - - activityTimer = setInterval(() => { - this.config = workspace.getConfiguration('discord'); - void this.setActivity(this.config.get('workspaceElapsedTime')); - }, 1000); - - this.rpc.subscribe('ACTIVITY_SPECTATE', async ({ secret }: { secret: string }) => { - const liveshare = await vsls.getApi(); - if (!liveshare) return; - try { - const s = Buffer.from(secret, 'base64').toString(); - // You might be asking yourself: "but why?" - // VS Liveshare has this annoying bug where you convert a URL string to a URI object to autofill - // But the autofill will be empty, so to circumvent this I need to add copying the link to the clipboard - // And immediately pasting it after the window pops up empty - await env.clipboard.writeText(s); - const uriString = await env.clipboard.readText(); - const uri = Uri.parse(uriString); - await liveshare.join(uri); - } catch (error) { - Logger.log(error); - } - }); - - // You might be asking yourself again: "but why?" - // Same here, this is a real nasty race condition that happens inside the discord-rpc module currently - // To circumvent this we need to timeout sending the subscribe events to the discord client - setTimeout(() => { - this.rpc.subscribe( - 'ACTIVITY_JOIN_REQUEST', - async ({ user }: { user: { username: string; discriminator: string } }) => { - const val = await window.showInformationMessage( - `${user.username}#${user.discriminator} wants to join your session`, - { title: 'Accept' }, - { title: 'Decline' }, - ); - if (val && val.title === 'Accept') await this.rpc.sendJoinInvite(user); - else await this.rpc.closeJoinRequest(user); - }, - ); - }, 1000); - setTimeout(() => { - this.rpc.subscribe('ACTIVITY_JOIN', async ({ secret }: { secret: string }) => { - const liveshare = await vsls.getApi(); - if (!liveshare) return; - try { - const s = Buffer.from(secret, 'base64').toString(); - // You might be asking yourself again again: "but why?" - // See first comment above - await env.clipboard.writeText(s); - const uriString = await env.clipboard.readText(); - const uri = Uri.parse(uriString); - await liveshare.join(uri); - } catch (error) { - Logger.log(error); - } - }); - }, 2000); - - const liveshare = await vsls.getApi(); - if (!liveshare) return; - - liveshare.onDidChangeSession(({ session }) => { - if (session.id) return this.activity.changePartyId(session.id); - return this.activity.changePartyId(); - }); - liveshare.onDidChangePeers(({ added, removed }) => { - if (added.length) return this.activity.increasePartySize(added.length); - else if (removed.length) return this.activity.decreasePartySize(removed.length); - }); - }); - - try { - await this.rpc.login({ clientId: this.clientId }); - } catch (error) { - throw error; - } - } - - public dispose() { - this.activity.dispose(); - if (this.rpc) this.rpc.destroy(); - this.rpc = null; - this.statusBarIcon.tooltip = ''; - - if (activityTimer) clearInterval(activityTimer); - } -} diff --git a/src/constants.ts b/src/constants.ts index c4168f4..5bee0e7 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,8 +1,51 @@ -export const LIVE_SHARE_BASE_URL = 'insiders.liveshare.vsengsaas.visualstudio.com'; -export const VSLS_EXTENSION_ID = 'ms-vsliveshare.vsliveshare'; +import LANG from './data/languages.json'; -export const LIVE_SHARE_COMMANDS = { - Start: 'liveshare.start', - End: 'liveshare.end', - Join: 'liveshare.join', -}; +export const CLIENT_ID = '383226320970055681' as const; + +export const KNOWN_EXTENSIONS: { [key: string]: { image: string } } = LANG.KNOWN_EXTENSIONS; +export const KNOWN_LANGUAGES: { language: string; image: string }[] = LANG.KNOWN_LANGUAGES; + +export const EMPTY = '\u200b\u200b'; +export const FILE_SIZES = [' bytes', 'kb', 'mb', 'gb', 'tb']; + +export const IDLE_IMAGE_KEY = 'vscode-big'; +export const DEBUG_IMAGE_KEY = 'debug'; +export const VSCODE_IMAGE_KEY = 'vscode'; +export const VSCODE_INSIDERS_IMAGE_KEY = 'vscode-insiders'; + +export const enum REPLACE_KEYS { + Empty = '{empty}', + FileName = '{file_name}', + DirName = '{dir_name}', + FullDirName = '{full_dir_name}', + Workspace = '{workspace}', + WorkspaceFolder = '{workspace_folder}', + WorkspaceAndFolder = '{workspace_and_folder}', + LanguageLowerCase = '{lang}', + LanguageTitleCase = '{Lang}', + LanguageUpperCase = '{LANG}', + TotalLines = '{total_lines}', + CurrentLine = '{current_line}', + CurrentColumn = '{current_column}', + FileSize = '{file_size}', + AppName = '{app_name}', + GitRepoName = '{git_repo_name}', + GitBranch = '{git_branch}', +} + +export const enum CONFIG_KEYS { + Enabled = 'enabled', + DetailsIdling = 'details_idling', + DetailsEditing = 'details_editing', + DetailsDebugging = 'details_debugging', + LowerDetailsIdling = 'lower_details_idling', + LowerDetailsEditing = 'lower_details_editing', + LowerDetailsDebugging = 'lower_details_debugging', + LowerDetailsNoWorkspaceFound = 'lower_details_no_workspace_found', + LargeImageIdling = 'large_image_idling', + LargeImage = 'large_image', + SmallImage = 'small_image', + SuppressNotifications = 'suppress_notifications', + WorkspaceElapsedTime = 'workspace_elapsed_time', + WorkspaceExcludePatterns = 'workspace_exclude_patterns', +} diff --git a/src/data/languages.json b/src/data/languages.json index 5b6a5e4..78e4325 100644 --- a/src/data/languages.json +++ b/src/data/languages.json @@ -1,520 +1,445 @@ { - "knownLanguages": [ - "ahk", - "android", - "angular", - "applescript", - "appveyor", - "arduino", - "as", - "asp", - "assembly", - "autoit", - "babel", - "bat", - "bower", - "brainfuck", - "c", - "cargo", - "cfml", - "circleci", - "clojure", - "cmake", - "codeclimate", - "coffee", - "cpp", - "crystal", - "csharp", - "cshtml", - "css", - "cuda", - "d", - "dart", - "delphi", - "denizen", - "dm", - "docker", - "editorconfig", - "ejs", - "elixir", - "elm", - "env", - "erlang", - "eslint", - "flowconfig", - "fsharp", - "gemfile", - "git", - "go", - "godot", - "gradle", - "graphql", - "groovy", - "gruntfile", - "gulp", - "handlebars", - "harbour", - "haskell", - "haxe", - "heroku", - "hjson", - "html", - "http", - "ini", - "jar", - "java", - "jest", - "jinja", - "js", - "jsmap", - "json", - "jsx", - "julia", - "jupyter", - "kotlin", - "less", - "lisp", - "livescript", - "log", - "lua", - "makefile", - "manifest", - "markdown", - "markdownx", - "marko", - "nim", - "nix", - "nodemon", - "npm", - "objc", - "ocaml", - "pascal", - "pawn", - "perl", - "php", - "ponylang", - "postcss", - "powershell", - "prettier", - "prisma", - "processing", - "pug", - "purescript", - "python", - "r", - "reasonml", - "ruby", - "rust", - "scala", - "scss", - "shell", - "sqf", - "sql", - "stylus", - "svelte", - "svg", - "swift", - "tex", - "text", - "toml", - "travis", - "ts", - "tsx", - "twig", - "typescript-def", - "v", - "v", - "vala", - "vb", - "vba", - "vbhtml", - "vbproj", - "vcxproj", - "vscodeignore", - "vue", - "wasm", - "webpack", - "xml", - "yaml", - "yarn", - "zig" - ], - "knownExtensions": { - ".ahk": { "image": "ahk" }, - ".ahkl": { "image": "ahk" }, - "androidmanifest.xml": { "image": "android" }, - "/^angular[^.]*\\.js$/i": { "image": "angular" }, - ".applescript": { "image": "applescript" }, - "/(\\.)?appveyor\\.yml/i": { "image": "appveyor" }, - ".ino": { "image": "arduino" }, - ".swf": { "image": "as" }, - ".as": { "image": "as" }, - ".jsfl": { "image": "as" }, - ".swc": { "image": "as" }, - ".asp": { "image": "asp" }, - ".asax": { "image": "asp" }, - ".ascx": { "image": "asp" }, - ".ashx": { "image": "asp" }, - ".asmx": { "image": "asp" }, - ".aspx": { "image": "asp" }, - ".axd": { "image": "asp" }, - "/\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$/i": { "image": "assembly" }, - ".agc": { "image": "assembly" }, - ".ko": { "image": "assembly" }, - ".lst": { "image": "assembly" }, - "/\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i": { "image": "assembly" }, - ".d-objdump": { "image": "assembly" }, - "/\\.gcode|\\.gco/i": { "image": "assembly" }, - "/\\.rpy[bc]$/i": { "image": "assembly" }, - "/\\.py[co]$/i": { "image": "assembly" }, - ".swp": { "image": "assembly" }, - ".DS_Store": { "image": "assembly" }, - ".au3": { "image": "autoit" }, - "babel.config.js": { "image": "babel" }, - "/\\.babelrc/i": { "image": "babel" }, - ".bat": { "image": "bat" }, - ".batch": { "image": "bat" }, - ".cmd": { "image": "bat" }, - "/\\.(exe|com|msi)$/i": { "image": "bat" }, - ".reg": { "image": "bat" }, - "/^(\\.bowerrc|bower\\.json|Bowerfile)$/i": { "image": "bower" }, - "/\\.bf?$/i": { "image": "brainfuck" }, - "/\\.c$/i": { "image": "c" }, - "/(cargo.toml|cargo.lock)/i": { "image": "cargo" }, - ".cfc": { "image": "cfml" }, - ".cfm": { "image": "cfml" }, - "circle.yml": { "image": "circleci" }, - ".clj": { "image": "clojure" }, - ".cl2": { "image": "clojure" }, - ".cljc": { "image": "clojure" }, - ".cljx": { "image": "clojure" }, - ".hic": { "image": "clojure" }, - "/\\.cljs(cm)?$/i": { "image": "clojure" }, - ".cmake": { "image": "cmake" }, - "/^CMakeLists\\.txt$/": { "image": "cmake" }, - "/\\.codeclimate\\.(yml|json)/i": { "image": "codeclimate" }, - ".coffee": { "image": "coffee" }, - ".cjsx": { "image": "coffee" }, - ".coffee.ecr": { "image": "coffee" }, - ".coffee.erb": { "image": "coffee" }, - ".litcoffee": { "image": "coffee" }, - ".iced": { "image": "coffee" }, - "/\\.c[+px]{2}$|\\.cc$/i": { "image": "cpp" }, - "/\\.h[+px]{2}$/i": { "image": "cpp" }, - "/\\.[it]pp$/i": { "image": "cpp" }, - "/\\.(tcc|inl)$/i": { "image": "cpp" }, - ".cats": { "image": "cpp" }, - ".idc": { "image": "cpp" }, - ".w": { "image": "cpp" }, - ".nc": { "image": "cpp" }, - ".upc": { "image": "cpp" }, - ".xpm": { "image": "cpp" }, - "/\\.e?cr$/i": { "image": "crystal" }, - ".cs": { "image": "csharp" }, - ".csx": { "image": "csharp" }, - ".cshtml": { "image": "cshtml" }, - ".css": { "image": "css" }, - ".css.map": { "image": "cssmap" }, - ".cu": { "image": "cuda" }, - "/\\.di?$/i": { "image": "d" }, - ".dart": { "image": "dart" }, - ".dfm": { "image": "delphi" }, - ".dpr": { "image": "delphi" }, - ".dsc": { "image": "denizen" }, - ".dm": { "image": "dm" }, - ".dme": { "image": "dm" }, - ".dmm": { "image": "dm" }, - "/^(Dockerfile|docker-compose)|\\.docker(file|ignore)$/i": { "image": "docker" }, - "/^docker-sync\\.yml$/i": { "image": "docker" }, - ".editorconfig": { "image": "editorconfig" }, - ".ejs": { "image": "ejs" }, - ".ex": { "image": "elixir" }, - "/\\.(exs|l?eex)$/i": { "image": "elixir" }, - "/^mix\\.(exs?|lock)$/i": { "image": "elixir" }, - ".elm": { "image": "elm" }, - ".env": { "image": "env" }, - ".erl": { "image": "erlang" }, - ".beam": { "image": "erlang" }, - ".hrl": { "image": "erlang" }, - ".xrl": { "image": "erlang" }, - ".yrl": { "image": "erlang" }, - ".app.src": { "image": "erlang" }, - "/^Emakefile$/": { "image": "erlang" }, - "/^rebar(\\.config)?\\.lock$/i": { "image": "erlang" }, - "/\\.(eslintrc|eslintignore)/i": { "image": "eslint" }, - "/(\\.firebaserc|firebase\\.json)/i": { "image": "firebase" }, - ".flowconfig": { "image": "flowconfig" }, - ".fs": { "image": "fsharp" }, - ".fsi": { "image": "fsharp" }, - ".fsscript": { "image": "fsharp" }, - ".fsx": { "image": "fsharp" }, - "/gatsby-(browser|node|ssr|config)\\.js/i": { "image": "gatsbyjs" }, - "/^Gemfile(\\.lock)?$/i": { "image": "gemfile" }, - "/^\\.git|^\\.keep$|\\.mailmap$/i": { "image": "git" }, - ".go": { "image": "go" }, - ".gd": { "image": "godot" }, - ".gradle": { "image": "gradle" }, - "gradlew": { "image": "gradle" }, - ".gql": { "image": "graphql" }, - ".graphql": { "image": "graphql" }, - ".groovy": { "image": "groovy" }, - ".gvy": { "image": "groovy" }, - ".gy": { "image": "groovy" }, - ".gsh": { "image": "groovy" }, - "/gruntfile\\.(js|coffee)/i": { "image": "gruntfile" }, - "gulpfile.js": { "image": "gulp" }, - "/\\.(hbs|handlebars|(mu)?stache)$/i": { "image": "handlebars" }, - ".prg": { "image": "harbour" }, - ".hbp": { "image": "harbour" }, - ".hbc": { "image": "harbour" }, - ".rc": { "image": "harbour" }, - ".fmg": { "image": "harbour" }, - ".hs": { "image": "haskell" }, - ".hsc": { "image": "haskell" }, - ".c2hs": { "image": "haskell" }, - ".lhs": { "image": "haskell" }, - ".hx": { "image": "haxe" }, - ".hxml": { "image": "haxe" }, - "/^procfile/i": { "image": "heroku" }, - "heroku.yml": { "image": "heroku" }, - ".hjson": { "image": "hjson" }, - "/\\.x?html?$/i": { "image": "html" }, - ".http": { "image": "http" }, - ".rest": { "image": "http" }, - ".jar": { "image": "jar" }, - ".java": { "image": "java" }, - "jest.config.js": { "image": "jest" }, - ".jinja": { "image": "jinja" }, - ".js": { "image": "js" }, - ".es6": { "image": "js" }, - ".es": { "image": "js" }, - ".mjs": { "image": "js" }, - ".js.map": { "image": "jsmap" }, - ".json": { "image": "json" }, - ".jsonc": { "image": "json" }, - ".jsx": { "image": "jsx" }, - "/\\.(jil|jl)/i": { "image": "julia" }, - ".ipynb": { "image": "jupyter" }, - ".kt": { "image": "kotlin" }, - ".ktm": { "image": "kotlin" }, - ".kts": { "image": "kotlin" }, - ".less": { "image": "less" }, - ".lsp": { "image": "lisp" }, - ".lisp": { "image": "lisp" }, - ".l": { "image": "lisp" }, - ".nl": { "image": "lisp" }, - ".ny": { "image": "lisp" }, - ".podsl": { "image": "lisp" }, - ".sexp": { "image": "lisp" }, - ".ls": { "image": "livescript" }, - ".log": { "image": "log" }, - ".lua": { "image": "lua" }, - ".pd_lua": { "image": "lua" }, - ".rbxs": { "image": "lua" }, - ".wlua": { "image": "lua" }, - "/^Makefile/": { "image": "makefile" }, - "/^mk\\.config$/": { "image": "makefile" }, - "/\\.(mk|mak|make)$/i": { "image": "makefile" }, - "/^BSDmakefile$/i": { "image": "makefile" }, - "/^GNUmakefile$/i": { "image": "makefile" }, - "/^makefile\\.sco$/i": { "image": "makefile" }, - "/^Kbuild$/": { "image": "makefile" }, - "/^makefile$/": { "image": "makefile" }, - "/^mkfile$/i": { "image": "makefile" }, - "/^\\.?qmake$/i": { "image": "makefile" }, - "/\\.(h|geo|topo)$/i": { "image": "manifest" }, - ".cson": { "image": "manifest" }, - ".json5": { "image": "manifest" }, - ".ndjson": { "image": "manifest" }, - ".fea": { "image": "manifest" }, - ".json.eex": { "image": "manifest" }, - ".proto": { "image": "manifest" }, - ".pytb": { "image": "manifest" }, - ".pydeps": { "image": "manifest" }, - "/\\.pot?$/i": { "image": "manifest" }, - ".ejson": { "image": "manifest" }, - ".edn": { "image": "manifest" }, - ".eam.fs": { "image": "manifest" }, - ".qml": { "image": "manifest" }, - ".qbs": { "image": "manifest" }, - ".ston": { "image": "manifest" }, - ".ttl": { "image": "manifest" }, - ".rviz": { "image": "manifest" }, - ".syntax": { "image": "manifest" }, - ".webmanifest": { "image": "manifest" }, - "/^pkginfo$/": { "image": "manifest" }, - "/^mime\\.types$/i": { "image": "manifest" }, - "/^METADATA\\.pb$/": { "image": "manifest" }, - "/[\\/\\\\](?:magic[\\/\\\\]Magdir|file[\\/\\\\]magic)[\\/\\\\][-.\\w]+$/i": { "image": "manifest" }, - "/(\\\\|\\/)dev[-\\w]+\\1(?:[^\\\\\\/]+\\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\\.in)?$/": { "image": "manifest" }, - "lib/icons/.icondb.js": { "image": "manifest" }, - "/\\.git[\\/\\\\](.*[\\/\\\\])?(HEAD|ORIG_HEAD|packed-refs|logs[\\/\\\\](.+[\\/\\\\])?[^\\/\\\\]+)$/": { - "image": "manifest" - }, - "/\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$/i": { "image": "markdown" }, - ".mdx": { "image": "markdownx" }, - ".marko": { "image": "marko" }, - ".nim": { "image": "nim" }, - ".nims": { "image": "nim" }, - ".nimble": { "image": "nim" }, - ".nix": { "image": "nix" }, - "nodemon.json": { "image": "nodemon" }, - ".npmrc": { "image": "npm" }, - "/\\.mm?$/i": { "image": "objc" }, - ".pch": { "image": "objc" }, - ".x": { "image": "objc" }, - ".ml": { "image": "ocaml" }, - ".mli": { "image": "ocaml" }, - ".eliom": { "image": "ocaml" }, - ".eliomi": { "image": "ocaml" }, - ".ml4": { "image": "ocaml" }, - ".mll": { "image": "ocaml" }, - ".mly": { "image": "ocaml" }, - "/\\.pas(cal)?$/i": { "image": "pascal" }, - ".lpr": { "image": "pascal" }, - ".p": { "image": "pawn" }, - ".inc": { "image": "pawn" }, - ".sma": { "image": "pawn" }, - ".pwn": { "image": "pawn" }, - ".sp": { "image": "pawn" }, - "/\\.p(er)?l$/i": { "image": "perl" }, - ".al": { "image": "perl" }, - ".ph": { "image": "perl" }, - ".plx": { "image": "perl" }, - ".pm": { "image": "perl" }, - "/\\.(psgi|xs)$/i": { "image": "perl" }, - ".pl6": { "image": "perl" }, - "/\\.[tp]6$|\\.6pl$/i": { "image": "perl" }, - "/\\.(pm6|p6m)$/i": { "image": "perl" }, - ".6pm": { "image": "perl" }, - ".nqp": { "image": "perl" }, - ".p6l": { "image": "perl" }, - ".pod6": { "image": "perl" }, - "/^Rexfile$/": { "image": "perl" }, - "/\\.php([st\\d]|_cs)?$/i": { "image": "php" }, - "/^Phakefile/": { "image": "php" }, - ".pony": { "image": "ponylang" }, - ".pcss": { "image": "postcss" }, - ".ps1": { "image": "powershell" }, - ".psd1": { "image": "powershell" }, - ".psm1": { "image": "powershell" }, - ".ps1xml": { "image": "powershell" }, - ".prettierignore": { "image": "prettier" }, - "/\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?$){2}/i": { "image": "prettier" }, - "prettier.config.js": { "image": "prettier" }, - "prisma.yml": { "image": "prisma" }, - ".pde": { "image": "processing" }, - ".jade": { "image": "pug" }, - ".pug": { "image": "pug" }, - ".purs": { "image": "purescript" }, - ".py": { "image": "python" }, - ".ipy": { "image": "python" }, - ".isolate": { "image": "python" }, - ".pep": { "image": "python" }, - ".gyp": { "image": "python" }, - ".gypi": { "image": "python" }, - ".pyde": { "image": "python" }, - ".pyp": { "image": "python" }, - ".pyt": { "image": "python" }, - ".py3": { "image": "python" }, - ".pyi": { "image": "python" }, - ".pyw": { "image": "python" }, - ".tac": { "image": "python" }, - ".wsgi": { "image": "python" }, - ".xpy": { "image": "python" }, - ".rpy": { "image": "python" }, - "/\\.?(pypirc|pythonrc|python-venv)$/i": { "image": "python" }, - "/^(SConstruct|SConscript)$/": { "image": "python" }, - "/^(Snakefile|WATCHLISTS)$/": { "image": "python" }, - "/^wscript$/": { "image": "python" }, - "/\\.(r|Rprofile|rsx|rd)$/i": { "image": "r" }, - ".re": { "image": "reasonml" }, - "/\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$/i": { "image": "ruby" }, - "/^\\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$/i": { "image": "ruby" }, - "/^(Appraisals|(Rake|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\\.lock)?)$/": { - "image": "ruby" - }, - "/\\.(jbuilder|rbuild|rb[wx]|builder)$/i": { "image": "ruby" }, - "/^rails$/": { "image": "ruby" }, - ".watchr": { "image": "ruby" }, - ".rs": { "image": "rust" }, - "/\\.(sc|scala)$/i": { "image": "scala" }, - ".scss": { "image": "scss" }, - ".sass": { "image": "scss" }, - "/\\.(sh|rc|bats|bash|tool|install|command)$/i": { "image": "shell" }, - "/^(\\.?bash(rc|[-_]?(profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$/i": { - "image": "shell" - }, - "/\\.(ksh|mksh|pdksh)$/i": { "image": "shell" }, - ".sh-session": { "image": "shell" }, - "/\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$/i": { "image": "shell" }, - "/\\.fish$|^\\.fishrc$/i": { "image": "shell" }, - "/^\\.?(login|profile)$/": { "image": "shell" }, - ".inputrc": { "image": "shell" }, - ".tmux": { "image": "shell" }, - "/^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$/": { "image": "shell" }, - "/^\\/(private\\/)?etc\\/([^\\/]+\\/)*(profile$|nanorc$|rc\\.|csh\\.)/i": { "image": "shell" }, - "/^\\.?cshrc$/i": { "image": "shell" }, - ".profile": { "image": "shell" }, - ".tcsh": { "image": "shell" }, - ".csh": { "image": "shell" }, - ".sqf": { "image": "sqf" }, - "/\\.(my)?sql$/i": { "image": "sql" }, - ".ddl": { "image": "sql" }, - ".udf": { "image": "sql" }, - ".hql": { "image": "sql" }, - ".viw": { "image": "sql" }, - ".prc": { "image": "sql" }, - ".cql": { "image": "sql" }, - ".db2": { "image": "sql" }, - "/\\.(styl|stylus)$/i": { "image": "stylus" }, - ".svelte": { "image": "svelte" }, - ".svg": { "image": "svg" }, - ".swift": { "image": "swift" }, - ".tex": { "image": "tex" }, - ".ltx": { "image": "tex" }, - ".aux": { "image": "tex" }, - ".sty": { "image": "tex" }, - ".dtx": { "image": "tex" }, - ".cls": { "image": "tex" }, - ".ins": { "image": "tex" }, - ".lbx": { "image": "tex" }, - ".mkiv": { "image": "tex" }, - ".mkvi": { "image": "tex" }, - ".mkii": { "image": "tex" }, - ".texi": { "image": "tex" }, - "/^hyphen(ex)?\\.(cs|den|det|fr|sv|us)$/": { "image": "tex" }, - "/\\.te?xt$/i": { "image": "text" }, - ".rtf": { "image": "text" }, - "/\\.i?nfo$/i": { "image": "text" }, - ".msg": { "image": "text" }, - "/\\.(utxt|utf8)$/i": { "image": "text" }, - ".toml": { "image": "toml" }, - ".travis.yml": { "image": "travis" }, - ".ts": { "image": "ts" }, - ".tsx": { "image": "tsx" }, - ".twig": { "image": "twig" }, - "/.*\\.d\\.ts/i": { "image": "typescript-def" }, - ".v": { "image": "v" }, - ".vh": { "image": "v" }, - ".vala": { "image": "vala" }, - ".vapi": { "image": "vala" }, - ".vb": { "image": "vb" }, - ".vbs": { "image": "vb" }, - ".vbhtml": { "image": "vb" }, - ".vbproj": { "image": "vb" }, - ".vba": { "image": "vba" }, - ".vcxproj": { "image": "vcxproj" }, - ".vscodeignore": { "image": "vscodeignore" }, - ".vue": { "image": "vue" }, - ".wat": { "image": "wasm" }, - ".wast": { "image": "wasm" }, - ".wasm": { "image": "wasm" }, - "/webpack(\\.dev|\\.development|\\.prod|\\.production)?\\.config(\\.babel)?\\.(js|jsx|coffee|ts|json|json5|yaml|yml)/i": { "image": "webpack" }, - ".xml": { "image": "xml" }, - "/\\.ya?ml$/i": { "image": "yaml" }, - "/^yarn(\\.lock)?$/i": { "image": "yarn" }, - ".yarnrc": { "image": "yarn" }, - ".zig": { "image": "zig" } - } + "KNOWN_LANGUAGES": [ + { "language": "abap", "image": "text" }, + { "language": "bat", "image": "bat" }, + { "language": "bibtex", "image": "text" }, + { "language": "clojure", "image": "clojure" }, + { "language": "coffeescript", "image": "coffeescript" }, + { "language": "c", "image": "c" }, + { "language": "cpp", "image": "cpp" }, + { "language": "csharp", "image": "csharp" }, + { "language": "css", "image": "css" }, + { "language": "diff", "image": "manifest" }, + { "language": "dockerfile", "image": "docker" }, + { "language": "fsharp", "image": "fsharp" }, + { "language": "git-commit", "image": "manifest" }, + { "language": "git-rebase", "image": "manifest" }, + { "language": "go", "image": "go" }, + { "language": "groovy", "image": "groovy" }, + { "language": "handlebars", "image": "handlebars" }, + { "language": "haml", "image": "text" }, + { "language": "html", "image": "html" }, + { "language": "ini", "image": "manifest" }, + { "language": "java", "image": "java" }, + { "language": "javascript", "image": "javascript" }, + { "language": "javascriptreact", "image": "jsx" }, + { "language": "jsx", "image": "jsx" }, + { "language": "json", "image": "json" }, + { "language": "jsonc", "image": "json" }, + { "language": "latex", "image": "text" }, + { "language": "less", "image": "less" }, + { "language": "lua", "image": "lua" }, + { "language": "makefile", "image": "makefile" }, + { "language": "markdown", "image": "markdown" }, + { "language": "objective-c", "image": "objective-c" }, + { "language": "objective-cpp", "image": "objective-c" }, + { "language": "perl", "image": "perl" }, + { "language": "perl6", "image": "perl" }, + { "language": "php", "image": "php" }, + { "language": "plaintext", "image": "text" }, + { "language": "powershell", "image": "powershell" }, + { "language": "jade", "image": "pug" }, + { "language": "pug", "image": "pug" }, + { "language": "python", "image": "python" }, + { "language": "r", "image": "r" }, + { "language": "razor", "image": "cshtml" }, + { "language": "ruby", "image": "ruby" }, + { "language": "rust", "image": "rust" }, + { "language": "scss", "image": "scss" }, + { "language": "sass", "image": "scss" }, + { "language": "shaderlab", "image": "manifest" }, + { "language": "slim", "image": "text" }, + { "language": "sql", "image": "sql" }, + { "language": "stylus", "image": "stylus" }, + { "language": "swift", "image": "swift" }, + { "language": "typescript", "image": "typescript" }, + { "language": "typescriptreact", "image": "tsx" }, + { "language": "tex", "image": "tex" }, + { "language": "vb", "image": "vb" }, + { "language": "vue", "image": "vue" }, + { "language": "vue-html", "image": "vue" }, + { "language": "xml", "image": "xml" }, + { "language": "xsl", "image": "xml" }, + { "language": "yaml", "image": "yaml" } + ], + "KNOWN_EXTENSIONS": { + ".ahk": { "image": "ahk" }, + ".ahkl": { "image": "ahk" }, + "androidmanifest.xml": { "image": "android" }, + "/^angular[^.]*\\.js$/i": { "image": "angular" }, + ".applescript": { "image": "applescript" }, + "/(\\.)?appveyor\\.yml/i": { "image": "appveyor" }, + ".ino": { "image": "arduino" }, + ".swf": { "image": "as" }, + ".as": { "image": "as" }, + ".jsfl": { "image": "as" }, + ".swc": { "image": "as" }, + ".asp": { "image": "asp" }, + ".asax": { "image": "asp" }, + ".ascx": { "image": "asp" }, + ".ashx": { "image": "asp" }, + ".asmx": { "image": "asp" }, + ".aspx": { "image": "asp" }, + ".axd": { "image": "asp" }, + "/\\.(l?a|[ls]?o|out|s|a51|asm|axf|elf|prx|puff|z80)$/i": { "image": "assembly" }, + ".agc": { "image": "assembly" }, + ".ko": { "image": "assembly" }, + ".lst": { "image": "assembly" }, + "/\\.((c([+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i": { "image": "assembly" }, + ".d-objdump": { "image": "assembly" }, + "/\\.gcode|\\.gco/i": { "image": "assembly" }, + "/\\.rpy[bc]$/i": { "image": "assembly" }, + "/\\.py[co]$/i": { "image": "assembly" }, + ".swp": { "image": "assembly" }, + ".DS_Store": { "image": "assembly" }, + ".au3": { "image": "autoit" }, + "babel.config.js": { "image": "babel" }, + "/\\.babelrc/i": { "image": "babel" }, + ".bat": { "image": "bat" }, + ".batch": { "image": "bat" }, + ".cmd": { "image": "bat" }, + "/\\.(exe|com|msi)$/i": { "image": "bat" }, + ".reg": { "image": "bat" }, + "/^(\\.bowerrc|bower\\.json|Bowerfile)$/i": { "image": "bower" }, + "/\\.bf?$/i": { "image": "brainfuck" }, + "/\\.c$/i": { "image": "c" }, + "/(cargo.toml|cargo.lock)/i": { "image": "cargo" }, + ".cfc": { "image": "cfml" }, + ".cfm": { "image": "cfml" }, + "circle.yml": { "image": "circleci" }, + ".clj": { "image": "clojure" }, + ".cl2": { "image": "clojure" }, + ".cljc": { "image": "clojure" }, + ".cljx": { "image": "clojure" }, + ".hic": { "image": "clojure" }, + "/\\.cljs(cm)?$/i": { "image": "clojure" }, + ".cmake": { "image": "cmake" }, + "/^CMakeLists\\.txt$/": { "image": "cmake" }, + "/\\.codeclimate\\.(yml|json)/i": { "image": "codeclimate" }, + ".coffee": { "image": "coffeescript" }, + ".cjsx": { "image": "coffeescript" }, + ".coffee.ecr": { "image": "coffeescript" }, + ".coffee.erb": { "image": "coffeescript" }, + ".litcoffee": { "image": "coffeescript" }, + ".iced": { "image": "coffeescript" }, + "/\\.c[+px]{2}$|\\.cc$/i": { "image": "cpp" }, + "/\\.h[+px]{2}$/i": { "image": "cpp" }, + "/\\.[it]pp$/i": { "image": "cpp" }, + "/\\.(tcc|inl)$/i": { "image": "cpp" }, + ".cats": { "image": "cpp" }, + ".idc": { "image": "cpp" }, + ".w": { "image": "cpp" }, + ".nc": { "image": "cpp" }, + ".upc": { "image": "cpp" }, + ".xpm": { "image": "cpp" }, + "/\\.e?cr$/i": { "image": "crystal" }, + ".cs": { "image": "csharp" }, + ".csx": { "image": "csharp" }, + ".cshtml": { "image": "cshtml" }, + ".css": { "image": "css" }, + ".css.map": { "image": "cssmap" }, + ".cu": { "image": "cuda" }, + "/\\.di?$/i": { "image": "d" }, + ".dart": { "image": "dart" }, + ".dfm": { "image": "delphi" }, + ".dpr": { "image": "delphi" }, + ".dsc": { "image": "denizen" }, + ".dm": { "image": "dm" }, + ".dme": { "image": "dm" }, + ".dmm": { "image": "dm" }, + "/^(Dockerfile|docker-compose)|\\.docker(file|ignore)$/i": { "image": "docker" }, + "/^docker-sync\\.yml$/i": { "image": "docker" }, + ".editorconfig": { "image": "editorconfig" }, + ".ejs": { "image": "ejs" }, + ".ex": { "image": "elixir" }, + "/\\.(exs|l?eex)$/i": { "image": "elixir" }, + "/^mix\\.(exs?|lock)$/i": { "image": "elixir" }, + ".elm": { "image": "elm" }, + ".env": { "image": "env" }, + ".erl": { "image": "erlang" }, + ".beam": { "image": "erlang" }, + ".hrl": { "image": "erlang" }, + ".xrl": { "image": "erlang" }, + ".yrl": { "image": "erlang" }, + ".app.src": { "image": "erlang" }, + "/^Emakefile$/": { "image": "erlang" }, + "/^rebar(\\.config)?\\.lock$/i": { "image": "erlang" }, + "/\\.(eslintrc|eslintignore)/i": { "image": "eslint" }, + "/(\\.firebaserc|firebase\\.json)/i": { "image": "firebase" }, + ".flowconfig": { "image": "flowconfig" }, + ".fs": { "image": "fsharp" }, + ".fsi": { "image": "fsharp" }, + ".fsscript": { "image": "fsharp" }, + ".fsx": { "image": "fsharp" }, + "/gatsby-(browser|node|ssr|config)\\.js/i": { "image": "gatsbyjs" }, + "/^Gemfile(\\.lock)?$/i": { "image": "gemfile" }, + "/^\\.git|^\\.keep$|\\.mailmap$/i": { "image": "git" }, + ".go": { "image": "go" }, + ".gd": { "image": "godot" }, + ".gradle": { "image": "gradle" }, + "gradlew": { "image": "gradle" }, + ".gql": { "image": "graphql" }, + ".graphql": { "image": "graphql" }, + ".groovy": { "image": "groovy" }, + ".gvy": { "image": "groovy" }, + ".gy": { "image": "groovy" }, + ".gsh": { "image": "groovy" }, + "/gruntfile\\.(js|coffee)/i": { "image": "gruntfile" }, + "gulpfile.js": { "image": "gulp" }, + "/\\.(hbs|handlebars|(mu)?stache)$/i": { "image": "handlebars" }, + ".prg": { "image": "harbour" }, + ".hbp": { "image": "harbour" }, + ".hbc": { "image": "harbour" }, + ".rc": { "image": "harbour" }, + ".fmg": { "image": "harbour" }, + ".hs": { "image": "haskell" }, + ".hsc": { "image": "haskell" }, + ".c2hs": { "image": "haskell" }, + ".lhs": { "image": "haskell" }, + ".hx": { "image": "haxe" }, + ".hxml": { "image": "haxe" }, + "/^procfile/i": { "image": "heroku" }, + "heroku.yml": { "image": "heroku" }, + ".hjson": { "image": "hjson" }, + "/\\.x?html?$/i": { "image": "html" }, + ".http": { "image": "http" }, + ".rest": { "image": "http" }, + ".jar": { "image": "jar" }, + ".java": { "image": "java" }, + "jest.config.js": { "image": "jest" }, + ".jinja": { "image": "jinja" }, + ".js": { "image": "javascript" }, + ".es6": { "image": "javascript" }, + ".es": { "image": "javascript" }, + ".mjs": { "image": "javascript" }, + ".js.map": { "image": "jsmap" }, + ".json": { "image": "json" }, + ".jsonc": { "image": "json" }, + ".jsx": { "image": "jsx" }, + "/\\.(jil|jl)/i": { "image": "julia" }, + ".ipynb": { "image": "jupyter" }, + ".kt": { "image": "kotlin" }, + ".ktm": { "image": "kotlin" }, + ".kts": { "image": "kotlin" }, + ".less": { "image": "less" }, + ".lsp": { "image": "lisp" }, + ".lisp": { "image": "lisp" }, + ".l": { "image": "lisp" }, + ".nl": { "image": "lisp" }, + ".ny": { "image": "lisp" }, + ".podsl": { "image": "lisp" }, + ".sexp": { "image": "lisp" }, + ".ls": { "image": "livescript" }, + ".log": { "image": "log" }, + ".lua": { "image": "lua" }, + ".pd_lua": { "image": "lua" }, + ".rbxs": { "image": "lua" }, + ".wlua": { "image": "lua" }, + "/^Makefile/": { "image": "makefile" }, + "/^mk\\.config$/": { "image": "makefile" }, + "/\\.(mk|mak|make)$/i": { "image": "makefile" }, + "/^BSDmakefile$/i": { "image": "makefile" }, + "/^GNUmakefile$/i": { "image": "makefile" }, + "/^makefile\\.sco$/i": { "image": "makefile" }, + "/^Kbuild$/": { "image": "makefile" }, + "/^makefile$/": { "image": "makefile" }, + "/^mkfile$/i": { "image": "makefile" }, + "/^\\.?qmake$/i": { "image": "makefile" }, + "/\\.(h|geo|topo)$/i": { "image": "manifest" }, + ".cson": { "image": "manifest" }, + ".json5": { "image": "manifest" }, + ".ndjson": { "image": "manifest" }, + ".fea": { "image": "manifest" }, + ".json.eex": { "image": "manifest" }, + ".proto": { "image": "manifest" }, + ".pytb": { "image": "manifest" }, + ".pydeps": { "image": "manifest" }, + "/\\.pot?$/i": { "image": "manifest" }, + ".ejson": { "image": "manifest" }, + ".edn": { "image": "manifest" }, + ".eam.fs": { "image": "manifest" }, + ".qml": { "image": "manifest" }, + ".qbs": { "image": "manifest" }, + ".ston": { "image": "manifest" }, + ".ttl": { "image": "manifest" }, + ".rviz": { "image": "manifest" }, + ".syntax": { "image": "manifest" }, + ".webmanifest": { "image": "manifest" }, + "/^pkginfo$/": { "image": "manifest" }, + "/^mime\\.types$/i": { "image": "manifest" }, + "/^METADATA\\.pb$/": { "image": "manifest" }, + "/[\\/\\\\](?:magic[\\/\\\\]Magdir|file[\\/\\\\]magic)[\\/\\\\][-.\\w]+$/i": { "image": "manifest" }, + "/(\\\\|\\/)dev[-\\w]+\\1(?:[^\\\\\\/]+\\1)*(?!DESC|NOTES)(?:[A-Z][-A-Z]*)(?:\\.in)?$/": { "image": "manifest" }, + "lib/icons/.icondb.js": { "image": "manifest" }, + "/\\.git[\\/\\\\](.*[\\/\\\\])?(HEAD|ORIG_HEAD|packed-refs|logs[\\/\\\\](.+[\\/\\\\])?[^\\/\\\\]+)$/": { + "image": "manifest" + }, + "/\\.(md|mdown|markdown|mkd|mkdown|mdwn|mkdn|rmd|ron|pmd)$/i": { "image": "markdown" }, + ".mdx": { "image": "markdownx" }, + ".marko": { "image": "marko" }, + ".nim": { "image": "nim" }, + ".nims": { "image": "nim" }, + ".nimble": { "image": "nim" }, + ".nix": { "image": "nix" }, + "nodemon.json": { "image": "nodemon" }, + ".npmrc": { "image": "npm" }, + "/\\.mm?$/i": { "image": "objective-c" }, + ".pch": { "image": "objective-c" }, + ".x": { "image": "objective-c" }, + ".ml": { "image": "ocaml" }, + ".mli": { "image": "ocaml" }, + ".eliom": { "image": "ocaml" }, + ".eliomi": { "image": "ocaml" }, + ".ml4": { "image": "ocaml" }, + ".mll": { "image": "ocaml" }, + ".mly": { "image": "ocaml" }, + "/\\.pas(cal)?$/i": { "image": "pascal" }, + ".lpr": { "image": "pascal" }, + ".p": { "image": "pawn" }, + ".inc": { "image": "pawn" }, + ".sma": { "image": "pawn" }, + ".pwn": { "image": "pawn" }, + ".sp": { "image": "pawn" }, + "/\\.p(er)?l$/i": { "image": "perl" }, + ".al": { "image": "perl" }, + ".ph": { "image": "perl" }, + ".plx": { "image": "perl" }, + ".pm": { "image": "perl" }, + "/\\.(psgi|xs)$/i": { "image": "perl" }, + ".pl6": { "image": "perl" }, + "/\\.[tp]6$|\\.6pl$/i": { "image": "perl" }, + "/\\.(pm6|p6m)$/i": { "image": "perl" }, + ".6pm": { "image": "perl" }, + ".nqp": { "image": "perl" }, + ".p6l": { "image": "perl" }, + ".pod6": { "image": "perl" }, + "/^Rexfile$/": { "image": "perl" }, + "/\\.php([st\\d]|_cs)?$/i": { "image": "php" }, + "/^Phakefile/": { "image": "php" }, + ".pony": { "image": "ponylang" }, + ".pcss": { "image": "postcss" }, + ".ps1": { "image": "powershell" }, + ".psd1": { "image": "powershell" }, + ".psm1": { "image": "powershell" }, + ".ps1xml": { "image": "powershell" }, + ".prettierignore": { "image": "prettier" }, + "/\\.prettier((rc)|(\\.(toml|yml|yaml|json|js))?$){2}/i": { "image": "prettier" }, + "prettier.config.js": { "image": "prettier" }, + "prisma.yml": { "image": "prisma" }, + ".pde": { "image": "processing" }, + ".jade": { "image": "pug" }, + ".pug": { "image": "pug" }, + ".purs": { "image": "purescript" }, + ".py": { "image": "python" }, + ".ipy": { "image": "python" }, + ".isolate": { "image": "python" }, + ".pep": { "image": "python" }, + ".gyp": { "image": "python" }, + ".gypi": { "image": "python" }, + ".pyde": { "image": "python" }, + ".pyp": { "image": "python" }, + ".pyt": { "image": "python" }, + ".py3": { "image": "python" }, + ".pyi": { "image": "python" }, + ".pyw": { "image": "python" }, + ".tac": { "image": "python" }, + ".wsgi": { "image": "python" }, + ".xpy": { "image": "python" }, + ".rpy": { "image": "python" }, + "/\\.?(pypirc|pythonrc|python-venv)$/i": { "image": "python" }, + "/^(SConstruct|SConscript)$/": { "image": "python" }, + "/^(Snakefile|WATCHLISTS)$/": { "image": "python" }, + "/^wscript$/": { "image": "python" }, + "/\\.(r|Rprofile|rsx|rd)$/i": { "image": "r" }, + ".re": { "image": "reasonml" }, + "/\\.(rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$/i": { "image": "ruby" }, + "/^\\.?(irbrc|gemrc|pryrc|ruby-(gemset|version))$/i": { "image": "ruby" }, + "/^(Appraisals|(Rake|[bB]uild|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(\\.lock)?)$/": { + "image": "ruby" + }, + "/\\.(jbuilder|rbuild|rb[wx]|builder)$/i": { "image": "ruby" }, + "/^rails$/": { "image": "ruby" }, + ".watchr": { "image": "ruby" }, + ".rs": { "image": "rust" }, + "/\\.(sc|scala)$/i": { "image": "scala" }, + ".scss": { "image": "scss" }, + ".sass": { "image": "scss" }, + "/\\.(sh|rc|bats|bash|tool|install|command)$/i": { "image": "shell" }, + "/^(\\.?bash(rc|[-_]?(profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$/i": { + "image": "shell" + }, + "/\\.(ksh|mksh|pdksh)$/i": { "image": "shell" }, + ".sh-session": { "image": "shell" }, + "/\\.zsh(-theme|_history)?$|^\\.?(antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$/i": { "image": "shell" }, + "/\\.fish$|^\\.fishrc$/i": { "image": "shell" }, + "/^\\.?(login|profile)$/": { "image": "shell" }, + ".inputrc": { "image": "shell" }, + ".tmux": { "image": "shell" }, + "/^(configure|config\\.(guess|rpath|status|sub)|depcomp|libtool|compile)$/": { "image": "shell" }, + "/^\\/(private\\/)?etc\\/([^\\/]+\\/)*(profile$|nanorc$|rc\\.|csh\\.)/i": { "image": "shell" }, + "/^\\.?cshrc$/i": { "image": "shell" }, + ".profile": { "image": "shell" }, + ".tcsh": { "image": "shell" }, + ".csh": { "image": "shell" }, + ".sqf": { "image": "sqf" }, + "/\\.(my)?sql$/i": { "image": "sql" }, + ".ddl": { "image": "sql" }, + ".udf": { "image": "sql" }, + ".hql": { "image": "sql" }, + ".viw": { "image": "sql" }, + ".prc": { "image": "sql" }, + ".cql": { "image": "sql" }, + ".db2": { "image": "sql" }, + "/\\.(styl|stylus)$/i": { "image": "stylus" }, + ".svelte": { "image": "svelte" }, + ".svg": { "image": "svg" }, + ".swift": { "image": "swift" }, + ".tex": { "image": "tex" }, + ".ltx": { "image": "tex" }, + ".aux": { "image": "tex" }, + ".sty": { "image": "tex" }, + ".dtx": { "image": "tex" }, + ".cls": { "image": "tex" }, + ".ins": { "image": "tex" }, + ".lbx": { "image": "tex" }, + ".mkiv": { "image": "tex" }, + ".mkvi": { "image": "tex" }, + ".mkii": { "image": "tex" }, + ".texi": { "image": "tex" }, + "/^hyphen(ex)?\\.(cs|den|det|fr|sv|us)$/": { "image": "tex" }, + "/\\.te?xt$/i": { "image": "text" }, + ".rtf": { "image": "text" }, + "/\\.i?nfo$/i": { "image": "text" }, + ".msg": { "image": "text" }, + "/\\.(utxt|utf8)$/i": { "image": "text" }, + ".toml": { "image": "toml" }, + ".travis.yml": { "image": "travis" }, + ".ts": { "image": "typescript" }, + ".tsx": { "image": "tsx" }, + ".twig": { "image": "twig" }, + "/.*\\.d\\.ts/i": { "image": "typescript-def" }, + ".v": { "image": "v" }, + ".vh": { "image": "v" }, + ".vala": { "image": "vala" }, + ".vapi": { "image": "vala" }, + ".vb": { "image": "vb" }, + ".vbs": { "image": "vb" }, + ".vbhtml": { "image": "vb" }, + ".vbproj": { "image": "vb" }, + ".vba": { "image": "vba" }, + ".vcxproj": { "image": "vcxproj" }, + ".vscodeignore": { "image": "vscodeignore" }, + ".vue": { "image": "vue" }, + ".wat": { "image": "wasm" }, + ".wast": { "image": "wasm" }, + ".wasm": { "image": "wasm" }, + "/webpack(\\.dev|\\.development|\\.prod|\\.production)?\\.config(\\.babel)?\\.(js|jsx|coffee|ts|json|json5|yaml|yml)/i": { + "image": "webpack" + }, + ".xml": { "image": "xml" }, + "/\\.ya?ml$/i": { "image": "yaml" }, + "/^yarn(\\.lock)?$/i": { "image": "yarn" }, + ".yarnrc": { "image": "yarn" }, + ".zig": { "image": "zig" } + } } diff --git a/src/extension.ts b/src/extension.ts index 2e6d013..feaee46 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,112 +1,118 @@ -import { commands, ExtensionContext, StatusBarAlignment, StatusBarItem, window, workspace, extensions } from 'vscode'; -import RPCClient from './client/RPCClient'; -import Logger from './structures/Logger'; -import { GitExtension } from './git'; -const { register } = require('discord-rpc'); // eslint-disable-line +const { Client } = require('discord-rpc'); // eslint-disable-line +import { + commands, + ExtensionContext, + StatusBarAlignment, + StatusBarItem, + window, + workspace, + extensions, + debug, +} from 'vscode'; +import { activity } from './activity'; -let loginTimeout: NodeJS.Timer | undefined; +import { CLIENT_ID, CONFIG_KEYS } from './constants'; +import { GitExtension } from './git'; +import { log, LogLevel } from './logger'; +import { getConfig } from './util'; const statusBarIcon: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Left); statusBarIcon.text = '$(pulse) Connecting to Discord...'; -const clientId = '383226320970055681'; -const config = workspace.getConfiguration('discord'); -register(clientId); -const rpc = new RPCClient(clientId, statusBarIcon); +const rpc = new Client({ transport: 'ipc' }); +const config = getConfig(); -export async function activate(context: ExtensionContext) { - Logger.log('Discord Presence activated!'); +async function sendActivity() { + rpc.setActivity(await activity()); +} + +async function login(context: ExtensionContext) { + rpc.once('ready', () => { + log(LogLevel.Info, 'Successfully connected to Discord'); + + statusBarIcon.text = '$(globe) Connected to Discord'; + statusBarIcon.tooltip = 'Connected to Discord'; + + void sendActivity(); + const onChangeActiveTextEditor = window.onDidChangeActiveTextEditor(() => sendActivity()); + const onChangeTextDocument = workspace.onDidChangeTextDocument(() => sendActivity()); + const onStartDebugSession = debug.onDidStartDebugSession(() => sendActivity()); + const onTerminateDebugSession = debug.onDidTerminateDebugSession(() => sendActivity()); + + context.subscriptions.push( + onChangeActiveTextEditor, + onChangeTextDocument, + onStartDebugSession, + onTerminateDebugSession, + ); + }); + + try { + await rpc.login({ clientId: CLIENT_ID }); + } catch (error) { + log(LogLevel.Error, `Encountered following error while trying to login:\n${error as string}`); + rpc.dispose(); + if (!config[CONFIG_KEYS.SuppressNotifications]) { + if (error?.message?.includes('ENOENT')) void window.showErrorMessage('No Discord client detected'); + else void window.showErrorMessage(`Couldn't connect to Discord via RPC: ${error as string}`); + } + rpc.statusBarIcon.text = '$(pulse) Reconnect to Discord'; + rpc.statusBarIcon.command = 'discord.reconnect'; + } +} + +export function activate(context: ExtensionContext) { + log(LogLevel.Info, 'Discord Presence activated'); let isWorkspaceExcluded = false; - const excludePatterns = config.get('workspaceExcludePatterns'); - if (excludePatterns?.length) { - for (const pattern of excludePatterns) { - const regex = new RegExp(pattern); - const folders = workspace.workspaceFolders; - if (!folders) break; - if (folders.some((folder) => regex.test(folder.uri.fsPath))) { - isWorkspaceExcluded = true; - break; - } + for (const pattern of config[CONFIG_KEYS.WorkspaceExcludePatterns]) { + const regex = new RegExp(pattern); + const folders = workspace.workspaceFolders; + if (!folders) break; + if (folders.some((folder) => regex.test(folder.uri.fsPath))) { + isWorkspaceExcluded = true; + break; } } const enabler = commands.registerCommand('discord.enable', () => { - rpc.dispose(); + rpc.destroy(); void config.update('enabled', true); - rpc.config = workspace.getConfiguration('discord'); - rpc.statusBarIcon.text = '$(pulse) Connecting to Discord...'; - rpc.statusBarIcon.show(); - void rpc.login(); - void window.showInformationMessage('Enabled Discord Rich Presence for this workspace.'); + statusBarIcon.text = '$(pulse) Connecting to Discord...'; + statusBarIcon.show(); + void login(context); + void window.showInformationMessage('Enabled Discord Presence for this workspace'); }); + const disabler = commands.registerCommand('discord.disable', () => { void config.update('enabled', false); - rpc.config = workspace.getConfiguration('discord'); - rpc.dispose(); + rpc.destroy(); rpc.statusBarIcon.hide(); - void window.showInformationMessage('Disabled Discord Rich Presence for this workspace.'); + void window.showInformationMessage('Disabled Discord Presence for this workspace'); }); + const reconnecter = commands.registerCommand('discord.reconnect', () => { - if (loginTimeout) clearTimeout(loginTimeout); - rpc.dispose(); - loginTimeout = setTimeout(() => { - void rpc.login(); - if (!config.get('silent')) void window.showInformationMessage('Reconnecting to Discord RPC...'); - rpc.statusBarIcon.text = '$(pulse) Reconnecting to Discord...'; - rpc.statusBarIcon.command = 'discord.reconnect'; - }, 1000); + deactivate(); + void activate(context); }); + const disconnect = commands.registerCommand('discord.disconnect', () => { - rpc.dispose(); + rpc.destroy(); rpc.statusBarIcon.text = '$(pulse) Reconnect to Discord'; rpc.statusBarIcon.command = 'discord.reconnect'; }); - const allowSpectate = commands.registerCommand('discord.allowSpectate', () => rpc.allowSpectate()); - const disableSpectate = commands.registerCommand('discord.disableSpectate', () => rpc.disableSpectate()); - const allowJoinRequests = commands.registerCommand('discord.allowJoinRequests', () => rpc.allowJoinRequests()); - const disableJoinRequests = commands.registerCommand('discord.disableJoinRequests', () => rpc.disableJoinRequests()); - context.subscriptions.push( - enabler, - disabler, - reconnecter, - disconnect, - allowSpectate, - disableSpectate, - allowJoinRequests, - disableJoinRequests, - ); + context.subscriptions.push(enabler, disabler, reconnecter, disconnect); - if (!isWorkspaceExcluded && config.get('enabled')) { + if (!isWorkspaceExcluded && config[CONFIG_KEYS.Enabled]) { statusBarIcon.show(); - try { - await rpc.login(); - } catch (error) { - Logger.log(`Encountered following error after trying to login:\n${error as string}`); - rpc.dispose(); - if (!config.get('silent')) { - if (error?.message?.includes('ENOENT')) void window.showErrorMessage('No Discord Client detected!'); - else void window.showErrorMessage(`Couldn't connect to Discord via RPC: ${error as string}`); - } - rpc.statusBarIcon.text = '$(pulse) Reconnect to Discord'; - rpc.statusBarIcon.command = 'discord.reconnect'; - } + void login(context); } const gitExtension = extensions.getExtension('vscode.git'); - if (gitExtension) { - if (gitExtension.isActive) { - rpc.git = gitExtension.exports.getAPI(1); - } else { - const extension = await gitExtension.activate(); - rpc.git = extension.getAPI(1); - } - } + void gitExtension?.activate(); } export function deactivate() { - rpc.dispose(); + rpc.destroy(); } - -process.on('unhandledRejection', (err) => Logger.log(err as string)); diff --git a/src/git.d.ts b/src/git.d.ts index bc46dde..338b733 100644 --- a/src/git.d.ts +++ b/src/git.d.ts @@ -1,10 +1,10 @@ -/* - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - */ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ -// eslint-disable-next-line -import { Uri, SourceControlInputBox, Event, CancellationToken } from 'vscode'; +import { Uri, Event, Disposable, ProviderResult } from 'vscode'; +export { ProviderResult } from 'vscode'; export interface Git { readonly path: string; @@ -14,6 +14,11 @@ export interface InputBox { value: string; } +export const enum ForcePushMode { + Force, + ForceWithLease, +} + export const enum RefType { Head, RemoteHead, @@ -42,7 +47,10 @@ export interface Commit { readonly hash: string; readonly message: string; readonly parents: string[]; - readonly authorEmail?: string | undefined; + readonly authorDate?: Date; + readonly authorName?: string; + readonly authorEmail?: string; + readonly commitDate?: Date; } export interface Submodule { @@ -117,6 +125,24 @@ export interface RepositoryUIState { export interface LogOptions { /** Max number of log entries to retrieve. If not specified, the default is 32. */ readonly maxEntries?: number; + readonly path?: string; +} + +export interface CommitOptions { + all?: boolean | 'tracked'; + amend?: boolean; + signoff?: boolean; + signCommit?: boolean; + empty?: boolean; + noVerify?: boolean; + requireUserConfig?: boolean; +} + +export interface BranchQuery { + readonly remote?: boolean; + readonly pattern?: string; + readonly count?: number; + readonly contains?: string; } export interface Repository { @@ -157,6 +183,7 @@ export interface Repository { createBranch(name: string, checkout: boolean, ref?: string): Promise; deleteBranch(name: string, force?: boolean): Promise; getBranch(name: string): Promise; + getBranches(query: BranchQuery): Promise; setBranchUpstream(name: string, upstream: string): Promise; getMergeBase(ref1: string, ref2: string): Promise; @@ -166,24 +193,75 @@ export interface Repository { addRemote(name: string, url: string): Promise; removeRemote(name: string): Promise; + renameRemote(name: string, newName: string): Promise; fetch(remote?: string, ref?: string, depth?: number): Promise; pull(unshallow?: boolean): Promise; - push(remoteName?: string, branchName?: string, setUpstream?: boolean): Promise; + push(remoteName?: string, branchName?: string, setUpstream?: boolean, force?: ForcePushMode): Promise; blame(path: string): Promise; log(options?: LogOptions): Promise; + + commit(message: string, opts?: CommitOptions): Promise; +} + +export interface RemoteSource { + readonly name: string; + readonly description?: string; + readonly url: string | string[]; +} + +export interface RemoteSourceProvider { + readonly name: string; + readonly icon?: string; // codicon name + readonly supportsQuery?: boolean; + getRemoteSources(query?: string): ProviderResult; + getBranches?(url: string): ProviderResult; + publishRepository?(repository: Repository): Promise; +} + +export interface Credentials { + readonly username: string; + readonly password: string; +} + +export interface CredentialsProvider { + getCredentials(host: Uri): ProviderResult; +} + +export interface PushErrorHandler { + handlePushError( + repository: Repository, + remote: Remote, + refspec: string, + error: Error & { gitErrorCode: GitErrorCodes }, + ): Promise; } export type APIState = 'uninitialized' | 'initialized'; +export interface PublishEvent { + repository: Repository; + branch?: string; +} + export interface API { readonly state: APIState; readonly onDidChangeState: Event; + readonly onDidPublish: Event; readonly git: Git; readonly repositories: Repository[]; readonly onDidOpenRepository: Event; readonly onDidCloseRepository: Event; + + toGitUri(uri: Uri, ref: string): Uri; + getRepository(uri: Uri): Repository | null; + init(root: Uri): Promise; + openRepository(root: Uri): Promise; + + registerRemoteSourceProvider(provider: RemoteSourceProvider): Disposable; + registerCredentialsProvider(provider: CredentialsProvider): Disposable; + registerPushErrorHandler(handler: PushErrorHandler): Disposable; } export interface GitExtension { @@ -220,6 +298,7 @@ export const enum GitErrorCodes { CantOpenResource = 'CantOpenResource', GitNotFound = 'GitNotFound', CantCreatePipe = 'CantCreatePipe', + PermissionDenied = 'PermissionDenied', CantAccessRemote = 'CantAccessRemote', RepositoryNotFound = 'RepositoryNotFound', RepositoryIsLocked = 'RepositoryIsLocked', diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..5e8e8c5 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,33 @@ +import { window } from 'vscode'; +import dayjs from 'dayjs'; + +const outputChannel = window.createOutputChannel('Discord Presence'); + +export const enum LogLevel { + Trace = 'TRACE', + Debug = 'DEBUG', + Info = 'INFO', + Warn = 'WARN', + Error = 'ERROR', +} + +function send(level: string, message: string) { + outputChannel.appendLine(`[${dayjs().format('DD/MM/YYYY HH:mm:ss')} - ${level}] ${message}`); +} + +export function log(level: LogLevel, message: string | Error) { + if (typeof message === 'string') { + send(level, message); + } else if (message instanceof Error) { + send(level, message.message); + + if (message.stack) { + send(level, message.stack); + } + } else if (typeof message === 'object') { + try { + const json = JSON.stringify(message, null, 2); + send(level, json); + } catch {} + } +} diff --git a/src/structures/Activity.ts b/src/structures/Activity.ts deleted file mode 100644 index da25c16..0000000 --- a/src/structures/Activity.ts +++ /dev/null @@ -1,376 +0,0 @@ -import { basename, parse, sep } from 'path'; -import { debug, Disposable, env, window, workspace } from 'vscode'; -import * as vsls from 'vsls'; -import RPCClient from '../client/RPCClient'; -import lang from '../data/languages.json'; - -const knownExtensions: { [key: string]: { image: string } } = lang.knownExtensions; -const knownLanguages: string[] = lang.knownLanguages; - -const empty = '\u200b\u200b'; -const sizes = [' bytes', 'kb', 'mb', 'gb', 'tb']; - -export interface State { - details?: string; - state?: string; - startTimestamp?: number | null; - largeImageKey?: string; - largeImageText?: string; - smallImageKey?: string; - smallImageText?: string; - partyId?: string; - partySize?: number; - partyMax?: number; - matchSecret?: string; - joinSecret?: string; - spectateSecret?: string; - instance?: boolean; -} - -interface FileDetail { - size?: string; - totalLines?: string; - currentLine?: string; - currentColumn?: string; - gitbranch?: string; - gitreponame?: string; -} - -export default class Activity implements Disposable { - private _state: State | null = null; - - private lastKnownFile = ''; - - public constructor(private readonly client: RPCClient) {} - - public get state() { - return this._state; - } - - public async generate(workspaceElapsedTime = false) { - let largeImageKey: any = 'vscode-big'; - if (window.activeTextEditor) { - if (window.activeTextEditor.document.languageId === 'Log') return this._state; - if (this._state && window.activeTextEditor.document.fileName === this.lastKnownFile) { - return (this._state = { - ...this._state, - details: await this._generateDetails( - 'detailsDebugging', - 'detailsEditing', - 'detailsIdle', - this._state.largeImageKey, - ), - smallImageKey: debug.activeDebugSession - ? 'debug' - : env.appName.includes('Insiders') - ? 'vscode-insiders' - : 'vscode', - state: await this._generateDetails( - 'lowerDetailsDebugging', - 'lowerDetailsEditing', - 'lowerDetailsIdle', - this._state.largeImageKey, - ), - }); - } - this.lastKnownFile = window.activeTextEditor.document.fileName; - const filename = basename(window.activeTextEditor.document.fileName); - largeImageKey = - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - knownExtensions[ - Object.keys(knownExtensions).find((key) => { - if (filename.endsWith(key)) return true; - const match = /^\/(.*)\/([mgiy]+)$/.exec(key); - if (!match) return false; - const regex = new RegExp(match[1], match[2]); - return regex.test(filename); - })! - ] ?? - (knownLanguages.includes(window.activeTextEditor.document.languageId) - ? window.activeTextEditor.document.languageId - : null); - } - - let previousTimestamp = null; - if (this._state?.startTimestamp) previousTimestamp = this._state.startTimestamp; - - this._state = { - ...this._state, - details: await this._generateDetails('detailsDebugging', 'detailsEditing', 'detailsIdle', largeImageKey), - startTimestamp: - window.activeTextEditor && previousTimestamp && workspaceElapsedTime - ? previousTimestamp - : window.activeTextEditor - ? new Date().getTime() - : null, - state: await this._generateDetails( - 'lowerDetailsDebugging', - 'lowerDetailsEditing', - 'lowerDetailsIdle', - largeImageKey, - ), - largeImageKey: largeImageKey ? largeImageKey.image || largeImageKey : 'txt', - largeImageText: window.activeTextEditor - ? this.client.config - .get('largeImage')! - .replace('{lang}', largeImageKey ? largeImageKey.image || largeImageKey : 'txt') - .replace( - '{Lang}', - largeImageKey - ? (largeImageKey.image || largeImageKey).toLowerCase().replace(/^\w/, (c: string) => c.toUpperCase()) - : 'Txt', - ) - .replace('{LANG}', largeImageKey ? (largeImageKey.image || largeImageKey).toUpperCase() : 'TXT') || - window.activeTextEditor.document.languageId.padEnd(2, '\u200b') - : this.client.config.get('largeImageIdle'), - smallImageKey: debug.activeDebugSession - ? 'debug' - : env.appName.includes('Insiders') - ? 'vscode-insiders' - : 'vscode', - smallImageText: this.client.config.get('smallImage')!.replace('{appname}', env.appName), - }; - - return this._state; - } - - public async allowSpectate() { - if (!this._state) return; - const liveshare = await vsls.getApi(); - if (!liveshare) return; - const join = await liveshare.share({ suppressNotification: true, access: vsls.Access.ReadOnly }); - this._state = { - ...this._state, - spectateSecret: join ? Buffer.from(join.toString()).toString('base64') : undefined, - instance: true, - }; - - return this._state; - } - - public async disableSpectate() { - if (!this._state) return; - const liveshare = await vsls.getApi(); - if (!liveshare) return; - await liveshare.end(); - - delete this._state.spectateSecret; - this._state.instance = false; - - return this._state; - } - - public async allowJoinRequests() { - if (!this._state) return; - const liveshare = await vsls.getApi(); - if (!liveshare) return; - const join = await liveshare.share({ suppressNotification: true }); - this._state = { - ...this._state, - partyId: join ? join.query : undefined, - partySize: 1, - partyMax: 5, - joinSecret: join ? Buffer.from(join.toString()).toString('base64') : undefined, - instance: true, - }; - - return this._state; - } - - public async disableJoinRequests() { - if (!this._state) return; - const liveshare = await vsls.getApi(); - if (!liveshare) return; - await liveshare.end(); - - delete this._state.partyId; - delete this._state.partySize; - delete this._state.partyMax; - delete this._state.joinSecret; - this._state.instance = false; - - return this._state; - } - - public changePartyId(id?: string) { - if (!this._state) return; - if (!id) { - delete this._state.partyId; - delete this._state.partySize; - delete this._state.partyMax; - this._state.instance = false; - - return this._state; - } - this._state = { - ...this._state, - partyId: id, - partySize: this._state.partySize ? this._state.partySize + 1 : 1, - partyMax: 5, - instance: true, - }; - - return this._state; - } - - public increasePartySize(size?: number) { - if (!this._state) return; - if (this._state.partySize === 5) return; - this._state = { - ...this._state, - partySize: this._state.partySize ? this._state.partySize + 1 : size, - }; - - return this._state; - } - - public decreasePartySize(size?: number) { - if (!this._state) return; - if (this._state.partySize === 1) return; - this._state = { - ...this._state, - partySize: this._state.partySize ? this._state.partySize - 1 : size, - }; - - return this._state; - } - - public dispose() { - this._state = null; - this.lastKnownFile = ''; - } - - private async _generateDetails(debugging: string, editing: string, idling: string, largeImageKey: any) { - let raw = this.client.config.get(idling)!.replace('{null}', empty); - let filename = null; - let dirname = null; - let checkState = false; - let workspaceName = null; - let workspaceFolder = null; - let fullDirname = null; - if (window.activeTextEditor) { - filename = basename(window.activeTextEditor.document.fileName); - - const { dir } = parse(window.activeTextEditor.document.fileName); - const split = dir.split(sep); - dirname = split[split.length - 1]; - - checkState = Boolean(workspace.getWorkspaceFolder(window.activeTextEditor.document.uri)); - workspaceName = workspace.name; - workspaceFolder = checkState ? workspace.getWorkspaceFolder(window.activeTextEditor.document.uri) : null; - - if (workspaceFolder) { - const { name } = workspaceFolder; - const relativePath = workspace.asRelativePath(window.activeTextEditor.document.fileName).split(sep); - relativePath.splice(-1, 1); - fullDirname = `${name}${sep}${relativePath.join(sep)}`; - } - - if (debug.activeDebugSession) { - raw = this.client.config.get(debugging)!; - } else { - raw = this.client.config.get(editing)!; - } - - const { totalLines, size, currentLine, currentColumn, gitbranch, gitreponame } = await this._generateFileDetails( - raw, - ); - raw = raw - .replace('{null}', empty) - .replace('{filename}', filename) - .replace('{dirname}', dirname) - .replace('{fulldirname}', fullDirname!) - .replace( - '{workspace}', - workspaceName - ? workspaceName - : checkState && workspaceFolder - ? workspaceFolder.name - : this.client.config.get('lowerDetailsNotFound')!.replace('{null}', empty), - ) - .replace( - '{workspaceFolder}', - checkState && workspaceFolder - ? workspaceFolder.name - : this.client.config.get('lowerDetailsNotFound')!.replace('{null}', empty), - ) - .replace( - '{workspaceAndFolder}', - checkState && workspaceName && workspaceFolder - ? `${workspaceName} - ${workspaceFolder.name}` - : this.client.config.get('lowerDetailsNotFound')!.replace('{null}', empty), - ) - .replace('{lang}', largeImageKey ? largeImageKey.image || largeImageKey : 'txt') - .replace( - '{Lang}', - largeImageKey - ? (largeImageKey.image || largeImageKey).toLowerCase().replace(/^\w/, (c: string) => c.toUpperCase()) - : 'Txt', - ) - .replace('{LANG}', largeImageKey ? (largeImageKey.image || largeImageKey).toUpperCase() : 'TXT'); - if (totalLines) raw = raw.replace('{totallines}', totalLines); - if (size) raw = raw.replace('{filesize}', size); - if (currentLine) raw = raw.replace('{currentline}', currentLine); - if (currentColumn) raw = raw.replace('{currentcolumn}', currentColumn); - if (gitbranch) raw = raw.replace('{gitbranch}', gitbranch); - if (gitreponame) raw = raw.replace('{gitreponame}', gitreponame); - } - - return raw; - } - - private async _generateFileDetails(str?: string) { - const fileDetail: FileDetail = {}; - if (!str) return fileDetail; - - if (window.activeTextEditor) { - if (str.includes('{totallines}')) { - fileDetail.totalLines = window.activeTextEditor.document.lineCount.toLocaleString(); - } - - if (str.includes('{currentline}')) { - fileDetail.currentLine = (window.activeTextEditor.selection.active.line + 1).toLocaleString(); - } - - if (str.includes('{currentcolumn}')) { - fileDetail.currentColumn = (window.activeTextEditor.selection.active.character + 1).toLocaleString(); - } - - if (str.includes('{filesize}')) { - let currentDivision = 0; - let { size } = await workspace.fs.stat(window.activeTextEditor.document.uri); - const originalSize = size; - if (originalSize > 1000) { - size /= 1000; - currentDivision++; - while (size > 1000) { - currentDivision++; - size /= 1000; - } - } - fileDetail.size = `${originalSize > 1000 ? size.toFixed(2) : size}${sizes[currentDivision]}`; - } - - if (str.includes('{gitbranch}')) { - if (this.client.git?.repositories.length) { - fileDetail.gitbranch = this.client.git.repositories.find((repo) => repo.ui.selected)!.state.HEAD!.name; - } else { - fileDetail.gitbranch = 'Unknown'; - } - } - - if (str.includes('{gitreponame}')) { - if (this.client.git?.repositories.length) { - fileDetail.gitreponame = this.client.git.repositories - .find((repo) => repo.ui.selected)! - .state.remotes[0].fetchUrl!.split('/')[1] - .replace('.git', ''); - } else { - fileDetail.gitreponame = 'Unknown'; - } - } - } - - return fileDetail; - } -} diff --git a/src/structures/Logger.ts b/src/structures/Logger.ts deleted file mode 100644 index bbe244e..0000000 --- a/src/structures/Logger.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { OutputChannel, window } from 'vscode'; - -// eslint-disable-next-line -export default class Logger { - private static output?: OutputChannel; - - public static log(message: string) { - if (!this.output) { - this.output = window.createOutputChannel('Discord Presence'); - } - this.output.appendLine(message); - } -} diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..57fa778 --- /dev/null +++ b/src/util.ts @@ -0,0 +1,56 @@ +import { basename } from 'path'; +import { TextDocument, workspace, WorkspaceConfiguration } from 'vscode'; + +import { KNOWN_EXTENSIONS, KNOWN_LANGUAGES } from './constants'; + +type WorkspaceExtensionConfigurationuration = WorkspaceConfiguration & { + enabled: boolean; + details_editing: string; + details_debugging: string; + details_idling: string; + lower_details_editing: string; + lower_details_debugging: string; + lower_details_idling: string; + lower_details_no_workspace_found: string; + large_image: string; + large_image_idling: string; + small_image: string; + suppress_notifications: boolean; + workspace_elapsed_time: boolean; + workspace_exclude_patterns: string[]; +}; + +export function getConfig() { + return workspace.getConfiguration('discord') as WorkspaceExtensionConfigurationuration; +} + +export const toLower = (str: string) => str.toLocaleLowerCase(); + +export const toUpper = (str: string) => str.toLocaleUpperCase(); + +export const toTitle = (str: string) => toLower(str).replace(/^\w/, (c) => toUpper(c)); + +export function resolveFileIcon(document: TextDocument) { + const filename = basename(document.fileName); + const findKnownExtension = Object.keys(KNOWN_EXTENSIONS).find((key) => { + if (filename.endsWith(key)) { + return true; + } + + const match = /^\/(.*)\/([mgiy]+)$/.exec(key); + if (!match) { + return false; + } + + const regex = new RegExp(match[1], match[2]); + return regex.test(filename); + }); + const findKnownLanguage = KNOWN_LANGUAGES.find((key) => key.language === document.languageId); + const fileIcon = findKnownExtension + ? KNOWN_EXTENSIONS[findKnownExtension] + : findKnownLanguage + ? findKnownLanguage.image + : null; + + return typeof fileIcon === 'string' ? fileIcon : fileIcon?.image ?? 'text'; +} diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 08ac212..ebf375a 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "allowJs": true, + "allowJs": true }, "include": [ "**/*.ts", @@ -11,7 +11,7 @@ "**/*.test.ts", "**/*.test.js", "**/*.spec.ts", - "**/*.spec.js", + "**/*.spec.js" ], "exclude": [] } diff --git a/tsconfig.json b/tsconfig.json index 849b86a..3da9923 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,11 +6,9 @@ "removeComments": false, "alwaysStrict": true, "pretty": true, - "target": "es2017", + "target": "ES2019", "module": "commonjs", - "lib": [ - "ESNext" - ], + "lib": ["ESNext"], "outDir": "dist", "sourceMap": true, "inlineSources": true, diff --git a/webpack.config.js b/webpack.config.js index 7ef135d..349b25f 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,11 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +/* eslint-disable @typescript-eslint/no-require-imports */ + const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin'); const path = require('path'); +/** @type {import('webpack').Configuration} */ module.exports = { target: 'node', entry: './src/extension.ts',