diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 28575ebe..e05d270f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -11,7 +11,7 @@ is a great boon to your development process. To get ready to work on the codebase, please do the following: 1. Fork & clone the repository, and make sure you're on the **master** branch -2. Run `npm install` +2. Run `npm ci` 3. If you're working on voice, also run `npm install @discordjs/opus` or `npm install opusscript` 4. Code your heart out! 5. Run `npm test` to run ESLint and ensure any JSDoc changes are valid diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 22505dc2..c3c30e1c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,7 +21,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Build and deploy documentation uses: discordjs/action-docs@v1 @@ -41,7 +41,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Build and deploy webpack uses: discordjs/action-webpack@v1 diff --git a/.github/workflows/test-cron.yml b/.github/workflows/test-cron.yml index fec24cf6..ec1fdb11 100644 --- a/.github/workflows/test-cron.yml +++ b/.github/workflows/test-cron.yml @@ -16,7 +16,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Run ESLint uses: icrawl/action-eslint@v1 @@ -34,7 +34,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Run TSLint run: npm run lint:typings @@ -52,7 +52,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Register Problem Matcher run: echo "##[add-matcher].github/tsc.json" @@ -73,7 +73,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Test documentation run: npm run docs:test diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6f0f5b31..43ab5c09 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Run ESLint uses: icrawl/action-eslint@v1 @@ -32,7 +32,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Run TSLint run: npm run lint:typings @@ -50,7 +50,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Register Problem Matcher run: echo "##[add-matcher].github/tsc.json" @@ -71,7 +71,7 @@ jobs: node-version: 12 - name: Install dependencies - run: npm install + run: npm ci - name: Test documentation run: npm run docs:test diff --git a/esm/discord.mjs b/esm/discord.mjs index 29062fb3..d8a451f1 100644 --- a/esm/discord.mjs +++ b/esm/discord.mjs @@ -25,6 +25,7 @@ export const { SnowflakeUtil, Structures, SystemChannelFlags, + UserFlags, Util, version, ChannelManager, @@ -34,6 +35,7 @@ export const { GuildMemberManager, GuildMemberRoleManager, GuildManager, + ReactionManager, ReactionUserManager, MessageManager, PresenceManager, @@ -45,9 +47,11 @@ export const { resolveColor, resolveString, splitMessage, + Application, Base, Activity, APIMessage, + BaseGuildEmoji, CategoryChannel, Channel, ClientApplication, @@ -60,6 +64,7 @@ export const { GuildChannel, GuildEmoji, GuildMember, + GuildPreview, Integration, Invite, Message, diff --git a/package-lock.json b/package-lock.json index d44f6968..ea874955 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "discord.js", - "version": "12.3.1", + "version": "12.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -14,19 +14,19 @@ } }, "@babel/core": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.6.tgz", - "integrity": "sha512-Wpcv03AGnmkgm6uS6k8iwhIwTrcP0m17TL1n1sy7qD0qelDu4XNeW0dN0mHfa+Gei211yDaLoEe/VlbXQzM4Bg==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", + "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.6", - "@babel/helper-module-transforms": "^7.11.0", - "@babel/helpers": "^7.10.4", - "@babel/parser": "^7.11.5", + "@babel/generator": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.1", + "@babel/parser": "^7.12.3", "@babel/template": "^7.10.4", - "@babel/traverse": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -38,9 +38,9 @@ }, "dependencies": { "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "json5": { @@ -67,12 +67,12 @@ } }, "@babel/generator": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", - "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", + "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", "dev": true, "requires": { - "@babel/types": "^7.11.5", + "@babel/types": "^7.12.1", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -106,35 +106,37 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", - "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", + "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-imports": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", - "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz", + "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-module-transforms": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", - "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@babel/helper-replace-supers": "^7.10.4", - "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", "@babel/template": "^7.10.4", - "@babel/types": "^7.11.0", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", "lodash": "^4.17.19" } }, @@ -154,25 +156,24 @@ "dev": true }, "@babel/helper-replace-supers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", - "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz", + "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/helper-simple-access": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", - "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { @@ -191,14 +192,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", - "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz", + "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==", "dev": true, "requires": { "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1" } }, "@babel/highlight": { @@ -289,9 +290,9 @@ } }, "@babel/plugin-syntax-class-properties": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", - "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -390,26 +391,26 @@ } }, "@babel/traverse": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", - "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.11.5", + "@babel/generator": "^7.12.1", "@babel/helper-function-name": "^7.10.4", "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.11.5", - "@babel/types": "^7.11.5", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { "@babel/parser": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", - "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", "dev": true }, "globals": { @@ -421,9 +422,9 @@ } }, "@babel/types": { - "version": "7.11.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", - "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.4", @@ -657,29 +658,29 @@ "dev": true }, "@definitelytyped/header-parser": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.50.tgz", - "integrity": "sha512-hIeyvv/SVQT8rbflcpin6pZgN9OwXnwam3acWdgifAu/xLmmTp17XcnT6sFHffy1PDfoCuCMcVFAv1MHFSWUIQ==", + "version": "0.0.57", + "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.57.tgz", + "integrity": "sha512-0CNcUUANv93072vleKkXKT8xUNk9JLhaHVMZbBYP/km55T+V8eGCP6BS0pS80MPhvZouq2FmR/r8B5jlR+MQ8w==", "dev": true, "requires": { - "@definitelytyped/typescript-versions": "^0.0.50", + "@definitelytyped/typescript-versions": "^0.0.57", "@types/parsimmon": "^1.10.1", "parsimmon": "^1.13.0" } }, "@definitelytyped/typescript-versions": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.50.tgz", - "integrity": "sha512-DbNVwsuiUnzG/86Hr/Q+bqTWFcC4agqZovHa1PiPNxs14yYlEvx9eojnuWj+PkQ60uf47+7051J7CfqU6UhhRw==", + "version": "0.0.57", + "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.57.tgz", + "integrity": "sha512-PpA1dLjH//4fvZ6P5RVR10n+it0lBp/so3dgSAHdFmtHU42kPFc2TlwIYSDL0P5DcNVYViAwIvIIVbYF9hbD+Q==", "dev": true }, "@definitelytyped/utils": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.50.tgz", - "integrity": "sha512-5flcF2bfzJgATyJ2oZ+SuGP4byVCFcKl3YX7YOJDvC/IkpIT9+R4dsUu8zX2drax28qOX9SaPEkRsogbPDsaBA==", + "version": "0.0.57", + "resolved": "https://registry.npmjs.org/@definitelytyped/utils/-/utils-0.0.57.tgz", + "integrity": "sha512-YEIxwB2Im0GQ0lapCpoW+m3XeQqctf0aueuVbm2lNESZCVMgLXVSFaTIquhgKcp/KW+HzVldwH7RyEnbTZiWQw==", "dev": true, "requires": { - "@definitelytyped/typescript-versions": "^0.0.50", + "@definitelytyped/typescript-versions": "^0.0.57", "@types/node": "^12.12.29", "charm": "^1.0.2", "fs-extra": "^8.1.0", @@ -751,9 +752,9 @@ }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -795,48 +796,48 @@ "dev": true }, "@jest/console": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.3.0.tgz", - "integrity": "sha512-/5Pn6sJev0nPUcAdpJHMVIsA8sKizL2ZkcKPE5+dJrCccks7tcM7c9wbgHudBJbxXLoTbqsHkG1Dofoem4F09w==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.0.tgz", + "integrity": "sha512-ArGcZWAEYMWmWnc/QvxLDvFmGRPvmHeulhS7FUUAlUGR5vS/SqMfArsGaYmIFEThSotCMnEihwx1h62I1eg5lg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^26.3.0", - "jest-util": "^26.3.0", + "jest-message-util": "^26.6.0", + "jest-util": "^26.6.0", "slash": "^3.0.0" } }, "@jest/core": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.4.2.tgz", - "integrity": "sha512-sDva7YkeNprxJfepOctzS8cAk9TOekldh+5FhVuXS40+94SHbiicRO1VV2tSoRtgIo+POs/Cdyf8p76vPTd6dg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.0.tgz", + "integrity": "sha512-7wbunxosnC5zXjxrEtTQSblFjRVOT8qz1eSytw8riEeWgegy3ct91NLPEP440CDuWrmW3cOLcEGxIf9q2u6O9Q==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/reporters": "^26.4.1", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.0", + "@jest/reporters": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.3.0", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", + "jest-changed-files": "^26.6.0", + "jest-config": "^26.6.0", + "jest-haste-map": "^26.6.0", + "jest-message-util": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-resolve-dependencies": "^26.4.2", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", - "jest-watcher": "^26.3.0", + "jest-resolve": "^26.6.0", + "jest-resolve-dependencies": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", + "jest-watcher": "^26.6.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "rimraf": "^3.0.0", @@ -856,53 +857,53 @@ } }, "@jest/environment": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.3.0.tgz", - "integrity": "sha512-EW+MFEo0DGHahf83RAaiqQx688qpXgl99wdb8Fy67ybyzHwR1a58LHcO376xQJHfmoXTu89M09dH3J509cx2AA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.0.tgz", + "integrity": "sha512-l+5MSdiC4rUUrz8xPdj0TwHBwuoqMcAbFnsYDTn5FkenJl8b+lvC5NdJl1tVICGHWnx0fnjdd1luRZ7u3U4xyg==", "dev": true, "requires": { - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", - "jest-mock": "^26.3.0" + "jest-mock": "^26.6.0" } }, "@jest/fake-timers": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.3.0.tgz", - "integrity": "sha512-ZL9ytUiRwVP8ujfRepffokBvD2KbxbqMhrXSBhSdAhISCw3gOkuntisiSFv+A6HN0n0fF4cxzICEKZENLmW+1A==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.0.tgz", + "integrity": "sha512-7VQpjChrwlwvGNysS10lDBLOVLxMvMtpx0Xo6aIotzNVyojYk0NN0CR8R4T6h/eu7Zva/LB3P71jqwGdtADoag==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "@sinonjs/fake-timers": "^6.0.1", "@types/node": "*", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" } }, "@jest/globals": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.4.2.tgz", - "integrity": "sha512-Ot5ouAlehhHLRhc+sDz2/9bmNv9p5ZWZ9LE1pXGGTCXBasmi5jnYjlgYcYt03FBwLmZXCZ7GrL29c33/XRQiow==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.0.tgz", + "integrity": "sha512-rs3a/a8Lq8FgTx11SxbqIU2bDjsFU2PApl2oK2oUVlo84RSF76afFm2nLojW93AGssr715GHUwhq5b6mpCI5BQ==", "dev": true, "requires": { - "@jest/environment": "^26.3.0", - "@jest/types": "^26.3.0", - "expect": "^26.4.2" + "@jest/environment": "^26.6.0", + "@jest/types": "^26.6.0", + "expect": "^26.6.0" } }, "@jest/reporters": { - "version": "26.4.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.4.1.tgz", - "integrity": "sha512-aROTkCLU8++yiRGVxLsuDmZsQEKO6LprlrxtAuzvtpbIFl3eIjgIf3EUxDKgomkS25R9ZzwGEdB5weCcBZlrpQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.0.tgz", + "integrity": "sha512-PXbvHhdci5Rj1VFloolgLb+0kkdtzswhG8MzVENKJRI3O1ndwr52G6E/2QupjwrRcYnApZOelFf4nNpf5+SDxA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -913,22 +914,22 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-haste-map": "^26.6.0", + "jest-resolve": "^26.6.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", "node-notifier": "^8.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", "string-length": "^4.0.1", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^5.0.1" + "v8-to-istanbul": "^6.0.1" } }, "@jest/source-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.3.0.tgz", - "integrity": "sha512-hWX5IHmMDWe1kyrKl7IhFwqOuAreIwHhbe44+XH2ZRHjrKIh0LO5eLQ/vxHFeAfRwJapmxuqlGAEYLadDq6ZGQ==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", + "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -937,46 +938,46 @@ } }, "@jest/test-result": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.3.0.tgz", - "integrity": "sha512-a8rbLqzW/q7HWheFVMtghXV79Xk+GWwOK1FrtimpI5n1la2SY0qHri3/b0/1F0Ve0/yJmV8pEhxDfVwiUBGtgg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.0.tgz", + "integrity": "sha512-LV6X1ry+sKjseQsIFz3e6XAZYxwidvmeJFnVF08fq98q08dF1mJYI0lDq/LmH/jas+R4s0pwnNGiz1hfC4ZUBw==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.0", + "@jest/types": "^26.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.4.2.tgz", - "integrity": "sha512-83DRD8N3M0tOhz9h0bn6Kl6dSp+US6DazuVF8J9m21WAp5x7CqSMaNycMP0aemC/SH/pDQQddbsfHRTBXVUgog==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.0.tgz", + "integrity": "sha512-rWPTMa+8rejvePZnJmnKkmKWh0qILFDPpN0qbSif+KNGvFxqqDGafMo4P2Y8+I9XWrZQBeXL9IxPL4ZzDgRlbw==", "dev": true, "requires": { - "@jest/test-result": "^26.3.0", + "@jest/test-result": "^26.6.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", - "jest-runner": "^26.4.2", - "jest-runtime": "^26.4.2" + "jest-haste-map": "^26.6.0", + "jest-runner": "^26.6.0", + "jest-runtime": "^26.6.0" } }, "@jest/transform": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.3.0.tgz", - "integrity": "sha512-Isj6NB68QorGoFWvcOjlUhpkT56PqNIsXKR7XfvoDlCANn/IANlh8DrKAA2l2JKC3yWSMH5wS0GwuQM20w3b2A==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.0.tgz", + "integrity": "sha512-NUNA1NMCyVV9g5NIQF1jzW7QutQhB/HAocteCiUyH0VhmLXnGMTfPYQu1G6IjPk+k1SWdh2PD+Zs1vMqbavWzg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.3.0", + "jest-haste-map": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-util": "^26.3.0", + "jest-util": "^26.6.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "slash": "^3.0.0", @@ -985,9 +986,9 @@ } }, "@jest/types": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.3.0.tgz", - "integrity": "sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.0.tgz", + "integrity": "sha512-8pDeq/JVyAYw7jBGU83v8RMYAkdrRxLG3BGnAJuqaQAUd6GWBmND2uyl+awI88+hit48suLoLjNFtR+ZXxWaYg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -1033,9 +1034,9 @@ } }, "@types/babel__core": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", - "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", + "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1046,18 +1047,18 @@ } }, "@types/babel__generator": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", - "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", - "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -1065,9 +1066,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.14.tgz", - "integrity": "sha512-8w9szzKs14ZtBVuP6Wn7nMLRJ0D6dfB0VEBEyRgxrZ/Ln49aNMykrghM2FaNn4FJRzNppCSa0Rv9pBRM5Xc3wg==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -1149,36 +1150,36 @@ "dev": true }, "@types/parsimmon": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.2.tgz", - "integrity": "sha512-WVugAiBoLsmay9IPrLJoMnmLTP0cWPbc4w5c5suTevyhaJW9TWGyPbkFraNUk5YULf8vQ5C/3NBEQcIs6XfTcg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@types/parsimmon/-/parsimmon-1.10.3.tgz", + "integrity": "sha512-BbCYdfYC/XFsVkjWJCeCaUaeYlMHNJ2HmZYaCbsZ14k6qO/mX6n3u2sgtJxSeJLiDPaxb1LESgGA/qGP+AHSCQ==", "dev": true }, "@types/prettier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.0.tgz", - "integrity": "sha512-hiYA88aHiEIgDmeKlsyVsuQdcFn3Z2VuFd/Xm/HCnGnPD8UFU5BM128uzzRVVGEzKDKYUrRsRH9S2o+NUy/3IA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.5.tgz", + "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", "dev": true }, "@types/ws": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz", - "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==", + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.7.tgz", + "integrity": "sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA==", "dev": true, "requires": { "@types/node": "*" } }, "@types/yargs": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", - "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.9.tgz", + "integrity": "sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -1788,16 +1789,16 @@ } }, "babel-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.3.0.tgz", - "integrity": "sha512-sxPnQGEyHAOPF8NcUsD0g7hDCnvLL2XyblRBcgrzTWBB/mAIpWow3n1bEL+VghnnZfreLhFSBsFluRoK2tRK4g==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.0.tgz", + "integrity": "sha512-JI66yILI7stzjHccAoQtRKcUwJrJb4oMIxLTirL3GdAjGpaUBQSjZDFi9LsPkN4gftsS4R2AThAJwOjJxadwbg==", "dev": true, "requires": { - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "@types/babel__core": "^7.1.7", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.3.0", + "babel-preset-jest": "^26.5.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "slash": "^3.0.0" @@ -1817,9 +1818,9 @@ } }, "babel-plugin-jest-hoist": { - "version": "26.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.2.0.tgz", - "integrity": "sha512-B/hVMRv8Nh1sQ1a3EY8I0n4Y1Wty3NrR5ebOyVT302op+DOAau+xNEImGMsUWOC3++ZlMooCytKz+NgN8aKGbA==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", + "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", "dev": true, "requires": { "@babel/template": "^7.3.3", @@ -1829,9 +1830,9 @@ } }, "babel-preset-current-node-syntax": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz", - "integrity": "sha512-uyexu1sVwcdFnyq9o8UQYsXwXflIh8LvrF5+cKrYam93ned1CStffB3+BEcsxGSgagoA3GEyjDqO4a/58hyPYQ==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", @@ -1848,12 +1849,12 @@ } }, "babel-preset-jest": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz", - "integrity": "sha512-5WPdf7nyYi2/eRxCbVrE1kKCWxgWY4RsPEbdJWFm7QsesFGqjdkyLeu1zRkwM1cxK6EPIlNd6d2AxLk7J+t4pw==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", + "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^26.2.0", + "babel-plugin-jest-hoist": "^26.5.0", "babel-preset-current-node-syntax": "^0.1.3" } }, @@ -2360,9 +2361,9 @@ } }, "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "dev": true, "optional": true, "requires": { @@ -2373,7 +2374,7 @@ "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "readdirp": "~3.5.0" } }, "chownr": { @@ -2505,9 +2506,9 @@ "optional": true }, "collect-all": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.3.tgz", - "integrity": "sha512-0y0rBgoX8IzIjBAUnO73SEtSb4Mhk3IoceWJq5zZSxb9mWORhWH8xLYo4EDSOE1jRBk1LhmfjqWFFt10h/+MEA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", + "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", "dev": true, "requires": { "stream-connect": "^1.0.2", @@ -2984,9 +2985,9 @@ } }, "decimal.js": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", - "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", "dev": true }, "decode-uri-component": { @@ -3110,9 +3111,9 @@ "dev": true }, "diff-sequences": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.3.0.tgz", - "integrity": "sha512-5j5vdRcw3CNctePNYN0Wy2e/JbWT6cAYnXv5OuqPhDpyCGc0uLu2TK0zOCJWNB9kOIfYMSpIulRaDgIi4HJ6Ig==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", "dev": true }, "diffie-hellman": { @@ -3135,8 +3136,8 @@ } }, "discord.js-docgen": { - "version": "github:discordjs/docgen#54934d3e46546f014e93f605399c5a0c0906d62c", - "from": "github:discordjs/docgen", + "version": "git+https://github.com/discordjs/docgen.git#d40f54cfd2d0f03ff92d7ecfb29cd82694ee2c11", + "from": "git+https://github.com/discordjs/docgen.git", "dev": true, "requires": { "eslint": "^6.3.0", @@ -3493,12 +3494,12 @@ } }, "dts-critic": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.0.tgz", - "integrity": "sha512-7du6eeB41ukU/Gvar4ufxggQBZUZlwF0iCh42t9WoTorLCRl60SEgD3xPS0UinXX+KLltQSYNquSSTGm/iAy9Q==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/dts-critic/-/dts-critic-3.3.2.tgz", + "integrity": "sha512-9rVXHAvZgdB63Au4Pile2QaPA2/2Ucuu5CsVd6MhIqFdOzjuZVnyR9cdJPgrW12mk/fSYQyMJ5b3Nuyq2ZUFoQ==", "dev": true, "requires": { - "@definitelytyped/header-parser": "0.0.47", + "@definitelytyped/header-parser": "^0.0.57", "command-exists": "^1.2.8", "rimraf": "^3.0.2", "semver": "^6.2.0", @@ -3506,23 +3507,6 @@ "yargs": "^15.3.1" }, "dependencies": { - "@definitelytyped/header-parser": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@definitelytyped/header-parser/-/header-parser-0.0.47.tgz", - "integrity": "sha512-b00FK4hnYc6QnziyBW6yQA8cMt0S9rPKrhMtTC0+q4F7ulWJEN4VUmxL7MaOiwVLXwNkBYMGffvOshEnRklpoQ==", - "dev": true, - "requires": { - "@definitelytyped/typescript-versions": "^0.0.47", - "@types/parsimmon": "^1.10.1", - "parsimmon": "^1.13.0" - } - }, - "@definitelytyped/typescript-versions": { - "version": "0.0.47", - "resolved": "https://registry.npmjs.org/@definitelytyped/typescript-versions/-/typescript-versions-0.0.47.tgz", - "integrity": "sha512-dcHO2gx0M0oRqzK5+esiKmDcpjO9njIeaxUmz4/KACcuoEvgomn0WaJMDCX7d2+1CCXCkMWK8qzMZccgUPQVeA==", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3550,15 +3534,15 @@ } }, "dtslint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.0.0.tgz", - "integrity": "sha512-CFtRC9Fen0rHov1amucdjQ7p9WPfL8q0mXd7Bz36vVdS5Ru/9q2EHVz9BloJYsTQOFsEZCqKj8JlH2jNa91OlQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/dtslint/-/dtslint-4.0.4.tgz", + "integrity": "sha512-z5+aPNcF9gRjMLH95bMPsm1AYHERo3O6wFRf+2W1qRn/0b7xh4Qs1g+i0x/Th0Z3XRIIrhrBcW3dkvXgsQ95wA==", "dev": true, "requires": { - "@definitelytyped/header-parser": "^0.0.50", - "@definitelytyped/typescript-versions": "^0.0.50", - "@definitelytyped/utils": "^0.0.50", - "dts-critic": "^3.3.0", + "@definitelytyped/header-parser": "^0.0.57", + "@definitelytyped/typescript-versions": "^0.0.57", + "@definitelytyped/utils": "^0.0.57", + "dts-critic": "^3.3.2", "fs-extra": "^6.0.1", "json-stable-stringify": "^1.0.1", "strip-json-comments": "^2.0.1", @@ -3723,9 +3707,9 @@ } }, "emittery": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", - "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", + "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, "emoji-regex": { @@ -3806,20 +3790,20 @@ } }, "es-abstract": { - "version": "1.17.6", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", - "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", - "is-callable": "^1.2.0", - "is-regex": "^1.1.0", - "object-inspect": "^1.7.0", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", + "object.assign": "^4.1.1", "string.prototype.trimend": "^1.0.1", "string.prototype.trimstart": "^1.0.1" } @@ -3855,9 +3839,9 @@ } }, "eslint": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz", - "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", + "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -3868,9 +3852,9 @@ "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", - "eslint-scope": "^5.1.0", + "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^1.3.0", + "eslint-visitor-keys": "^2.0.0", "espree": "^7.3.0", "esquery": "^1.2.0", "esutils": "^2.0.2", @@ -3899,6 +3883,16 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "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, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, "eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -3906,8 +3900,22 @@ "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "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 + } } }, + "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 + }, "espree": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", @@ -3917,6 +3925,31 @@ "acorn": "^7.4.0", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "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 + } + } + }, + "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, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "levn": { @@ -3967,9 +4000,9 @@ } }, "eslint-config-prettier": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", - "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.13.0.tgz", + "integrity": "sha512-LcT0i0LSmnzqK2t764pyIt7kKH2AuuqKRTtJTdddWxOiUja9HdG5GXBVF2gmCTvVYWVsTu8J2MhJLVGRh+pj8w==", "dev": true, "requires": { "get-stdin": "^6.0.0" @@ -4038,9 +4071,9 @@ } }, "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", "dev": true, "requires": { "array-includes": "^3.1.1", @@ -4048,7 +4081,7 @@ "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", + "eslint-import-resolver-node": "^0.3.4", "eslint-module-utils": "^2.6.0", "has": "^1.0.3", "minimatch": "^3.0.4", @@ -4174,13 +4207,32 @@ } }, "eslint-scope": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", - "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", + "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, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "dependencies": { + "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, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + } } }, "eslint-utils": { @@ -4412,16 +4464,16 @@ } }, "expect": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.4.2.tgz", - "integrity": "sha512-IlJ3X52Z0lDHm7gjEp+m76uX46ldH5VpqmU0006vqDju/285twh7zaWMRhs67VpQhBwjjMchk+p5aA0VkERCAA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.0.tgz", + "integrity": "sha512-EzhbZ1tbwcaa5Ok39BI11flIMeIUSlg1QsnXOrleaMvltwHsvIQPBtL710l+ma+qDFLUgktCXK4YuQzmHdm7cg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "ansi-styles": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", "jest-regex-util": "^26.0.0" } }, @@ -5625,9 +5677,9 @@ "dev": true }, "is-callable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", - "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", "dev": true }, "is-ci": { @@ -5724,6 +5776,12 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5907,46 +5965,46 @@ } }, "jest": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.4.2.tgz", - "integrity": "sha512-LLCjPrUh98Ik8CzW8LLVnSCfLaiY+wbK53U7VxnFSX7Q+kWC4noVeDvGWIFw0Amfq1lq2VfGm7YHWSLBV62MJw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.0.tgz", + "integrity": "sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA==", "dev": true, "requires": { - "@jest/core": "^26.4.2", + "@jest/core": "^26.6.0", "import-local": "^3.0.2", - "jest-cli": "^26.4.2" + "jest-cli": "^26.6.0" }, "dependencies": { "jest-cli": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.4.2.tgz", - "integrity": "sha512-zb+lGd/SfrPvoRSC/0LWdaWCnscXc1mGYW//NP4/tmBvRPT3VntZ2jtKUONsRi59zc5JqmsSajA9ewJKFYp8Cw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.0.tgz", + "integrity": "sha512-lJAMZGpmML+y3Kfln6L5DGRTfKGQ+n1JDM1RQstojSLUhe/EaXWR8vmcx70v4CyJKvFZs7c/0QDkPX5ra/aDew==", "dev": true, "requires": { - "@jest/core": "^26.4.2", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/core": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", + "jest-config": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", "prompts": "^2.0.1", - "yargs": "^15.3.1" + "yargs": "^15.4.1" } } } }, "jest-changed-files": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.3.0.tgz", - "integrity": "sha512-1C4R4nijgPltX6fugKxM4oQ18zimS7LqQ+zTTY8lMCMFPrxqBFb7KJH0Z2fRQJvw2Slbaipsqq7s1mgX5Iot+g==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.0.tgz", + "integrity": "sha512-k8PZzlp3cRWDe0fDc/pYs+c4w36+hiWXe1PpW/pW1UJmu1TNTAcQfZUrVYleij+uEqlY6z4mPv7Iff3kY0o5SQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "execa": "^4.0.0", "throat": "^5.0.0" }, @@ -5995,41 +6053,41 @@ } }, "jest-config": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.4.2.tgz", - "integrity": "sha512-QBf7YGLuToiM8PmTnJEdRxyYy3mHWLh24LJZKVdXZ2PNdizSe1B/E8bVm+HYcjbEzGuVXDv/di+EzdO/6Gq80A==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.0.tgz", + "integrity": "sha512-RCR1Kf7MGJ5waVCvrj/k3nCAJKquWZlzs8rkskzj0KlG392hNBOaYd5FQ4cCac08j6pwfIDOwNvMcy0/FqguJg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.4.2", - "@jest/types": "^26.3.0", - "babel-jest": "^26.3.0", + "@jest/test-sequencer": "^26.6.0", + "@jest/types": "^26.6.0", + "babel-jest": "^26.6.0", "chalk": "^4.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.3.0", - "jest-environment-node": "^26.3.0", + "jest-environment-jsdom": "^26.6.0", + "jest-environment-node": "^26.6.0", "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.4.2", + "jest-jasmine2": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", + "jest-resolve": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", "micromatch": "^4.0.2", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.0" } }, "jest-diff": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.4.2.tgz", - "integrity": "sha512-6T1XQY8U28WH0Z5rGpQ+VqZSZz8EN8rZcBtfvXaOkbwxIEeRre6qnuZQlbY1AJ4MKDxQF8EkrCvK+hL/VkyYLQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.0.tgz", + "integrity": "sha512-IH09rKsdWY8YEY7ii2BHlSq59oXyF2pK3GoK+hOK9eD/x6009eNB5Jv1shLMKgxekodPzLlV7eZP1jPFQYds8w==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^26.3.0", + "diff-sequences": "^26.5.0", "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.0" } }, "jest-docblock": { @@ -6042,45 +6100,45 @@ } }, "jest-each": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.4.2.tgz", - "integrity": "sha512-p15rt8r8cUcRY0Mvo1fpkOGYm7iI8S6ySxgIdfh3oOIv+gHwrHTy5VWCGOecWUhDsit4Nz8avJWdT07WLpbwDA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.0.tgz", + "integrity": "sha512-7LzSNwNviYnm4FWK46itIE03NqD/8O8/7tVQ5rwTdTNrmPMQoQ1Z7hEFQ1uzRReluOFislpurpnQ0QsclSiDkA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2" + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0" } }, "jest-environment-jsdom": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.3.0.tgz", - "integrity": "sha512-zra8He2btIMJkAzvLaiZ9QwEPGEetbxqmjEBQwhH3CA+Hhhu0jSiEJxnJMbX28TGUvPLxBt/zyaTLrOPF4yMJA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.0.tgz", + "integrity": "sha512-bXO9IG7a3YlyiHxwfKF+OWoTA+GIw4FrD+Y0pb6CC+nKs5JuSRZmR2ovEX6PWo6KY42ka3JoZOp3KEnXiFPPCg==", "dev": true, "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0", - "jsdom": "^16.2.2" + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0", + "jsdom": "^16.4.0" } }, "jest-environment-node": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.3.0.tgz", - "integrity": "sha512-c9BvYoo+FGcMj5FunbBgtBnbR5qk3uky8PKyRVpSfe2/8+LrNQMiXX53z6q2kY+j15SkjQCOSL/6LHnCPLVHNw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.0.tgz", + "integrity": "sha512-kWU6ZD1h6fs7sIl6ufuK0sXW/3d6WLaj48iow0NxhgU6eY89d9K+0MVmE0cRcVlh53yMyxTK6b+TnhLOnlGp/A==", "dev": true, "requires": { - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", - "jest-mock": "^26.3.0", - "jest-util": "^26.3.0" + "jest-mock": "^26.6.0", + "jest-util": "^26.6.0" } }, "jest-get-type": { @@ -6090,12 +6148,12 @@ "dev": true }, "jest-haste-map": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.3.0.tgz", - "integrity": "sha512-DHWBpTJgJhLLGwE5Z1ZaqLTYqeODQIZpby0zMBsCU9iRFHYyhklYqP4EiG73j5dkbaAdSZhgB938mL51Q5LeZA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.0.tgz", + "integrity": "sha512-RpNqAGMR58uG9E9vWITorX2/R7he/tSbHWldX5upt1ymEcmCaXczqXxjqI6xOtRR8Ev6ZEYDfgSA5Fy7WHUL5w==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", @@ -6103,71 +6161,71 @@ "fsevents": "^2.1.2", "graceful-fs": "^4.2.4", "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.3.0", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.4.2.tgz", - "integrity": "sha512-z7H4EpCldHN1J8fNgsja58QftxBSL+JcwZmaXIvV9WKIM+x49F4GLHu/+BQh2kzRKHAgaN/E82od+8rTOBPyPA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.0.tgz", + "integrity": "sha512-2E3c+0A9y2OIK5caw5qlcm3b4doaf8FSfXKTX3xqKTUJoR4zXh0xvERBNWxZP9xMNXEi/2Z3LVsZpR2hROgixA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.3.0", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/environment": "^26.6.0", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "expect": "^26.4.2", + "expect": "^26.6.0", "is-generator-fn": "^2.0.0", - "jest-each": "^26.4.2", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-runtime": "^26.4.2", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "pretty-format": "^26.4.2", + "jest-each": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "pretty-format": "^26.6.0", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.4.2.tgz", - "integrity": "sha512-akzGcxwxtE+9ZJZRW+M2o+nTNnmQZxrHJxX/HjgDaU5+PLmY1qnQPnMjgADPGCRPhB+Yawe1iij0REe+k/aHoA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.0.tgz", + "integrity": "sha512-3oMv34imWTl1/nwKnmE/DxYo3QqHnZeF3nO6UzldppkhW0Za7OY2DYyWiamqVzwdUrjhoQkY5g+aF6Oc3alYEQ==", "dev": true, "requires": { "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.0" } }, "jest-matcher-utils": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.4.2.tgz", - "integrity": "sha512-KcbNqWfWUG24R7tu9WcAOKKdiXiXCbMvQYT6iodZ9k1f7065k0keUOW6XpJMMvah+hTfqkhJhRXmA3r3zMAg0Q==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.0.tgz", + "integrity": "sha512-BUy/dQYb7ELGRazmK4ZVkbfPYCaNnrMtw1YljVhcKzWUxBM0xQ+bffrfnMLdRZp4wUUcT4ahaVnA3VWZtXWP9Q==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^26.4.2", + "jest-diff": "^26.6.0", "jest-get-type": "^26.3.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.0" } }, "jest-message-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.3.0.tgz", - "integrity": "sha512-xIavRYqr4/otGOiLxLZGj3ieMmjcNE73Ui+LdSW/Y790j5acqCsAdDiLIbzHCZMpN07JOENRWX5DcU+OQ+TjTA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.0.tgz", + "integrity": "sha512-WPAeS38Kza29f04I0iOIQrXeiebRXjmn6cFehzI7KKJOgT0NmqYAcLgjWnIAfKs5FBmEQgje1kXab0DaLKCl2w==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.3.0", - "@types/stack-utils": "^1.0.1", + "@jest/types": "^26.6.0", + "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", @@ -6176,12 +6234,12 @@ } }, "jest-mock": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.3.0.tgz", - "integrity": "sha512-PeaRrg8Dc6mnS35gOo/CbZovoDPKAeB1FICZiuagAgGvbWdNNyjQjkOaGUa/3N3JtpQ/Mh9P4A2D4Fv51NnP8Q==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.0.tgz", + "integrity": "sha512-HsNmL8vVIn1rL1GWA21Drpy9Cl+7GImwbWz/0fkWHrUXVzuaG7rP0vwLtE+/n70Mt0U8nPkz8fxioi3SC0wqhw==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "@types/node": "*" } }, @@ -6198,92 +6256,92 @@ "dev": true }, "jest-resolve": { - "version": "26.4.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.4.0.tgz", - "integrity": "sha512-bn/JoZTEXRSlEx3+SfgZcJAVuTMOksYq9xe9O6s4Ekg84aKBObEaVXKOEilULRqviSLAYJldnoWV9c07kwtiCg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.0.tgz", + "integrity": "sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.3.0", + "jest-util": "^26.6.0", "read-pkg-up": "^7.0.1", "resolve": "^1.17.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.4.2.tgz", - "integrity": "sha512-ADHaOwqEcVc71uTfySzSowA/RdxUpCxhxa2FNLiin9vWLB1uLPad3we+JSSROq5+SrL9iYPdZZF8bdKM7XABTQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.0.tgz", + "integrity": "sha512-4di+XUT7LwJJ8b8qFEEDQssC5+aeVjLhvRICCaS4alh/EVS9JCT1armfJ3pnSS8t4o6659WbMmKVo82H4LuUVw==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.4.2" + "jest-snapshot": "^26.6.0" } }, "jest-runner": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.4.2.tgz", - "integrity": "sha512-FgjDHeVknDjw1gRAYaoUoShe1K3XUuFMkIaXbdhEys+1O4bEJS8Avmn4lBwoMfL8O5oFTdWYKcf3tEJyyYyk8g==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.0.tgz", + "integrity": "sha512-QpeN6pje8PQvFgT+wYOlzeycKd67qAvSw5FgYBiX2cTW+QTiObTzv/k09qRvT09rcCntFxUhy9VB1mgNGFLYIA==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.0", + "@jest/environment": "^26.6.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.7.1", "exit": "^0.1.2", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", + "jest-config": "^26.6.0", "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.3.0", - "jest-leak-detector": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", - "jest-runtime": "^26.4.2", - "jest-util": "^26.3.0", - "jest-worker": "^26.3.0", + "jest-haste-map": "^26.6.0", + "jest-leak-detector": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-resolve": "^26.6.0", + "jest-runtime": "^26.6.0", + "jest-util": "^26.6.0", + "jest-worker": "^26.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.4.2.tgz", - "integrity": "sha512-4Pe7Uk5a80FnbHwSOk7ojNCJvz3Ks2CNQWT5Z7MJo4tX0jb3V/LThKvD9tKPNVNyeMH98J/nzGlcwc00R2dSHQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.0.tgz", + "integrity": "sha512-JEz4YGnybFvtN4NLID6lsZf0bcd8jccwjWcG5TRE3fYVnxoX1egTthPjnC4btIwWJ6QaaHhtOQ/E3AGn8iClAw==", "dev": true, "requires": { - "@jest/console": "^26.3.0", - "@jest/environment": "^26.3.0", - "@jest/fake-timers": "^26.3.0", - "@jest/globals": "^26.4.2", - "@jest/source-map": "^26.3.0", - "@jest/test-result": "^26.3.0", - "@jest/transform": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/console": "^26.6.0", + "@jest/environment": "^26.6.0", + "@jest/fake-timers": "^26.6.0", + "@jest/globals": "^26.6.0", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.6.0", + "@jest/transform": "^26.6.0", + "@jest/types": "^26.6.0", "@types/yargs": "^15.0.0", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.4", - "jest-config": "^26.4.2", - "jest-haste-map": "^26.3.0", - "jest-message-util": "^26.3.0", - "jest-mock": "^26.3.0", + "jest-config": "^26.6.0", + "jest-haste-map": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-mock": "^26.6.0", "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.4.0", - "jest-snapshot": "^26.4.2", - "jest-util": "^26.3.0", - "jest-validate": "^26.4.2", + "jest-resolve": "^26.6.0", + "jest-snapshot": "^26.6.0", + "jest-util": "^26.6.0", + "jest-validate": "^26.6.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.3.1" + "yargs": "^15.4.1" }, "dependencies": { "strip-bom": { @@ -6295,9 +6353,9 @@ } }, "jest-serializer": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.3.0.tgz", - "integrity": "sha512-IDRBQBLPlKa4flg77fqg0n/pH87tcRKwe8zxOVTWISxGpPHYkRZ1dXKyh04JOja7gppc60+soKVZ791mruVdow==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", "dev": true, "requires": { "@types/node": "*", @@ -6305,35 +6363,36 @@ } }, "jest-snapshot": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.4.2.tgz", - "integrity": "sha512-N6Uub8FccKlf5SBFnL2Ri/xofbaA68Cc3MGjP/NuwgnsvWh+9hLIR/DhrxbSiKXMY9vUW5dI6EW1eHaDHqe9sg==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.0.tgz", + "integrity": "sha512-mcqJZeIZqxomvBcsaiIbiEe2g7K1UxnUpTwjMoHb+DX4uFGnuZoZ6m28YOYRyCfZsdU9mmq73rNBnEH2atTR4Q==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", + "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.0.0", "chalk": "^4.0.0", - "expect": "^26.4.2", + "expect": "^26.6.0", "graceful-fs": "^4.2.4", - "jest-diff": "^26.4.2", + "jest-diff": "^26.6.0", "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.3.0", - "jest-matcher-utils": "^26.4.2", - "jest-message-util": "^26.3.0", - "jest-resolve": "^26.4.0", + "jest-haste-map": "^26.6.0", + "jest-matcher-utils": "^26.6.0", + "jest-message-util": "^26.6.0", + "jest-resolve": "^26.6.0", "natural-compare": "^1.4.0", - "pretty-format": "^26.4.2", + "pretty-format": "^26.6.0", "semver": "^7.3.2" } }, "jest-util": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.3.0.tgz", - "integrity": "sha512-4zpn6bwV0+AMFN0IYhH/wnzIQzRaYVrz1A8sYnRnj4UXDXbOVtWmlaZkO9mipFqZ13okIfN87aDoJWB7VH6hcw==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.0.tgz", + "integrity": "sha512-/cUGqcnKeZMjvTQLfJo65nBOEZ/k0RB/8usv2JpfYya05u0XvBmKkIH5o5c4nCh9DD61B1YQjMGGqh1Ha0aXdg==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "@types/node": "*", "chalk": "^4.0.0", "graceful-fs": "^4.2.4", @@ -6342,46 +6401,46 @@ } }, "jest-validate": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.4.2.tgz", - "integrity": "sha512-blft+xDX7XXghfhY0mrsBCYhX365n8K5wNDC4XAcNKqqjEzsRUSXP44m6PL0QJEW2crxQFLLztVnJ4j7oPlQrQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.0.tgz", + "integrity": "sha512-FKHNqvh1Pgs4NWas56gsTPmjcIoGAAzSVUCK1+g8euzuCGbmdEr8LRTtOEFjd29uMZUk0PhzmzKGlHPe6j3UWw==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "camelcase": "^6.0.0", "chalk": "^4.0.0", "jest-get-type": "^26.3.0", "leven": "^3.1.0", - "pretty-format": "^26.4.2" + "pretty-format": "^26.6.0" }, "dependencies": { "camelcase": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", - "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.1.0.tgz", + "integrity": "sha512-WCMml9ivU60+8rEJgELlFp1gxFcEGxwYleE3bziHEDeqsqAWGHdimB7beBFGjLzVNgPGyDsfgXLQEYMpmIFnVQ==", "dev": true } } }, "jest-watcher": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.3.0.tgz", - "integrity": "sha512-XnLdKmyCGJ3VoF6G/p5ohbJ04q/vv5aH9ENI+i6BL0uu9WWB6Z7Z2lhQQk0d2AVZcRGp1yW+/TsoToMhBFPRdQ==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.0.tgz", + "integrity": "sha512-gw5BvcgPi0PKpMlNWQjUet5C5A4JOYrT7gexdP6+DR/f7mRm7wE0o1GqwPwcTsTwo0/FNf9c/kIDXTRaSAYwlw==", "dev": true, "requires": { - "@jest/test-result": "^26.3.0", - "@jest/types": "^26.3.0", + "@jest/test-result": "^26.6.0", + "@jest/types": "^26.6.0", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "jest-util": "^26.3.0", + "jest-util": "^26.6.0", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.3.0.tgz", - "integrity": "sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw==", + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", "dev": true, "requires": { "@types/node": "*", @@ -6421,9 +6480,9 @@ "dev": true }, "jsdoc": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.5.tgz", - "integrity": "sha512-SbY+i9ONuxSK35cgVHaI8O9senTE4CDYAmGSDJ5l3+sfe62Ff4gy96osy6OW84t4K4A8iGnMrlRrsSItSNp3RQ==", + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.6.tgz", + "integrity": "sha512-znR99e1BHeyEkSvgDDpX0sTiTu+8aQyDl9DawrkOGZTTW8hv0deIFXx87114zJ7gRaDZKVQD/4tr1ifmJp9xhQ==", "dev": true, "requires": { "@babel/parser": "^7.9.4", @@ -6737,9 +6796,9 @@ } }, "lint-staged": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.3.0.tgz", - "integrity": "sha512-an3VgjHqmJk0TORB/sdQl0CTkRg4E5ybYCXTTCSJ5h9jFwZbcgKIx5oVma5e7wp/uKt17s1QYFmYqT9MGVosGw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.2.tgz", + "integrity": "sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -7445,9 +7504,9 @@ }, "dependencies": { "uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", "dev": true, "optional": true } @@ -7647,15 +7706,37 @@ } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + } } }, "object.pick": { @@ -8030,9 +8111,9 @@ "dev": true }, "prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.1.tgz", - "integrity": "sha512-9bY+5ZWCfqj3ghYBLxApy2zf6m+NJo5GzmLTpr9FsApsfjriNnS2dahWReHMi7qNPhhHl9SYHJs2cHZLgexNIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, "prettier-linter-helpers": { @@ -8045,12 +8126,12 @@ } }, "pretty-format": { - "version": "26.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.4.2.tgz", - "integrity": "sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==", + "version": "26.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.0.tgz", + "integrity": "sha512-Uumr9URVB7bm6SbaByXtx+zGlS+0loDkFMHP0kHahMjmfCtmFY03iqd++5v3Ld6iB5TocVXlBN/T+DXMn9d4BA==", "dev": true, "requires": { - "@jest/types": "^26.3.0", + "@jest/types": "^26.6.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -8278,9 +8359,9 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "optional": true, "requires": { @@ -8783,20 +8864,20 @@ } }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "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, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, "dependencies": { "ajv": { - "version": "6.12.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", - "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -8826,9 +8907,9 @@ "dev": true }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -9642,30 +9723,38 @@ } }, "terser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.1.tgz", - "integrity": "sha512-yD80f4hdwCWTH5mojzxe1q8bN1oJbsK/vfJGLcPZM/fl+/jItIVNKhFIHqqR71OipFWMLgj3Kc+GIp6CeIqfnA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.7.tgz", + "integrity": "sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "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 + } } }, "terser-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-Wi0YFbWKG8gBXhbJmrMusRcoXl/C9U5BzIPC2Tn3Si0hejGhhIh0gPf9rEfOCxwigzRPLC8PXv42qDiRTocMXg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "dev": true, "requires": { "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.3.0", + "jest-worker": "^26.5.0", "p-limit": "^3.0.2", - "schema-utils": "^2.7.1", - "serialize-javascript": "^4.0.0", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", "source-map": "^0.6.1", - "terser": "^5.3.0", + "terser": "^5.3.4", "webpack-sources": "^1.4.3" }, "dependencies": { @@ -10035,9 +10124,9 @@ } }, "typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.2.tgz", - "integrity": "sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", "dev": true }, "typical": { @@ -10053,9 +10142,9 @@ "dev": true }, "uglify-js": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz", - "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==", + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.4.tgz", + "integrity": "sha512-FyYnoxVL1D6+jDGQpbK5jW6y/2JlVfRfEeQ67BPCUg5wfCjaKOpr2XeceE4QL+MkhxliLtf5EbrMDZgzpt2CNw==", "dev": true, "optional": true }, @@ -10223,9 +10312,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", - "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-6.0.1.tgz", + "integrity": "sha512-PzM1WlqquhBvsV+Gco6WSFeg1AGdD53ccMRkFeyHRE/KRZaVacPOmQYP3EeVgDBtKD2BJ8kgynBQ5OtKiHCH+w==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -10555,9 +10644,9 @@ "dev": true }, "webpack": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.1.tgz", - "integrity": "sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ==", + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -10586,9 +10675,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "braces": { @@ -10825,6 +10914,15 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -11193,9 +11291,9 @@ "dev": true }, "whatwg-url": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.2.tgz", - "integrity": "sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz", + "integrity": "sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", diff --git a/package.json b/package.json index 9896d7c8..5b2cdfb6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord.js", - "version": "12.3.1", + "version": "12.4.1", "description": "A powerful library for interacting with the Discord API", "main": "./src/index", "types": "./typings/index.d.ts", @@ -60,23 +60,23 @@ "@commitlint/cli": "^11.0.0", "@commitlint/config-angular": "^11.0.0", "@types/node": "^12.12.6", - "@types/ws": "^7.2.6", + "@types/ws": "^7.2.7", "cross-env": "^7.0.2", - "discord.js-docgen": "discordjs/docgen", - "dtslint": "^4.0.0", - "eslint": "^7.9.0", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-import": "^2.22.0", + "discord.js-docgen": "git+https://github.com/discordjs/docgen.git", + "dtslint": "^4.0.4", + "eslint": "^7.11.0", + "eslint-config-prettier": "^6.13.0", + "eslint-plugin-import": "^2.22.1", "eslint-plugin-prettier": "^3.1.4", "husky": "^4.3.0", - "jest": "^26.4.2", + "jest": "^26.6.0", "json-filter-loader": "^1.0.0", - "lint-staged": "^10.3.0", - "prettier": "^2.1.1", - "terser-webpack-plugin": "^4.2.0", + "lint-staged": "^10.4.2", + "prettier": "^2.1.2", + "terser-webpack-plugin": "^4.2.3", "tslint": "^6.1.3", - "typescript": "^4.0.2", - "webpack": "^4.44.1", + "typescript": "^4.0.3", + "webpack": "^4.44.2", "webpack-cli": "^3.3.12" }, "engines": { diff --git a/src/client/Client.js b/src/client/Client.js index 44d18701..fd02197c 100644 --- a/src/client/Client.js +++ b/src/client/Client.js @@ -432,6 +432,13 @@ class Client extends BaseClient { if (typeof options.messageSweepInterval !== 'number' || isNaN(options.messageSweepInterval)) { throw new TypeError('CLIENT_INVALID_OPTION', 'messageSweepInterval', 'a number'); } + if ( + typeof options.messageEditHistoryMaxSize !== 'number' || + isNaN(options.messageEditHistoryMaxSize) || + options.messageEditHistoryMaxSize < -1 + ) { + throw new TypeError('CLIENT_INVALID_OPTION', 'messageEditHistoryMaxSize', 'a number greater than or equal to -1'); + } if (typeof options.fetchAllMembers !== 'boolean') { throw new TypeError('CLIENT_INVALID_OPTION', 'fetchAllMembers', 'a boolean'); } diff --git a/src/client/actions/Action.js b/src/client/actions/Action.js index 2ac32ed3..07ce7ed5 100644 --- a/src/client/actions/Action.js +++ b/src/client/actions/Action.js @@ -94,7 +94,7 @@ class GenericAction { const guild = this.client.guilds.cache.get(data.guild_id); if (guild) { const member = this.getMember(data.member, guild); - return member ? member.user : undefined; + return member ? member.user : this.getUser(data.member.user); } } return this.getUser(data); diff --git a/src/client/actions/GuildEmojiCreate.js b/src/client/actions/GuildEmojiCreate.js index 379c62e0..f47ddd5f 100644 --- a/src/client/actions/GuildEmojiCreate.js +++ b/src/client/actions/GuildEmojiCreate.js @@ -5,13 +5,14 @@ const { Events } = require('../../util/Constants'); class GuildEmojiCreateAction extends Action { handle(guild, createdEmoji) { + const already = guild.emojis.cache.has(createdEmoji.id); const emoji = guild.emojis.add(createdEmoji); /** * Emitted whenever a custom emoji is created in a guild. * @event Client#emojiCreate * @param {GuildEmoji} emoji The emoji that was created */ - this.client.emit(Events.GUILD_EMOJI_CREATE, emoji); + if (!already) this.client.emit(Events.GUILD_EMOJI_CREATE, emoji); return { emoji }; } } diff --git a/src/client/actions/InviteCreate.js b/src/client/actions/InviteCreate.js index 63813315..34cfa845 100644 --- a/src/client/actions/InviteCreate.js +++ b/src/client/actions/InviteCreate.js @@ -9,7 +9,7 @@ class InviteCreateAction extends Action { const client = this.client; const channel = client.channels.cache.get(data.channel_id); const guild = client.guilds.cache.get(data.guild_id); - if (!channel && !guild) return false; + if (!channel) return false; const inviteData = Object.assign(data, { channel, guild }); const invite = new Invite(client, inviteData); diff --git a/src/client/actions/MessageUpdate.js b/src/client/actions/MessageUpdate.js index 07e2aacb..7667dea4 100644 --- a/src/client/actions/MessageUpdate.js +++ b/src/client/actions/MessageUpdate.js @@ -9,9 +9,9 @@ class MessageUpdateAction extends Action { const { id, channel_id, guild_id, author, timestamp, type } = data; const message = this.getMessage({ id, channel_id, guild_id, author, timestamp, type }, channel); if (message) { - message.patch(data); + const old = message.patch(data); return { - old: message._edits[0], + old, updated: message, }; } diff --git a/src/client/voice/VoiceConnection.js b/src/client/voice/VoiceConnection.js index 1a5a43e9..8c1057fc 100644 --- a/src/client/voice/VoiceConnection.js +++ b/src/client/voice/VoiceConnection.js @@ -165,7 +165,7 @@ class VoiceConnection extends EventEmitter { /** * The voice state of this connection - * @type {VoiceState} + * @type {?VoiceState} */ get voice() { return this.channel.guild.voice; @@ -203,8 +203,8 @@ class VoiceConnection extends EventEmitter { * Set the token and endpoint required to connect to the voice servers. * @param {string} token The voice token * @param {string} endpoint The voice endpoint - * @private * @returns {void} + * @private */ setTokenAndEndpoint(token, endpoint) { this.emit('debug', `Token "${token}" and endpoint "${endpoint}"`); diff --git a/src/client/voice/dispatcher/StreamDispatcher.js b/src/client/voice/dispatcher/StreamDispatcher.js index 62c46d37..bb1c7bba 100644 --- a/src/client/voice/dispatcher/StreamDispatcher.js +++ b/src/client/voice/dispatcher/StreamDispatcher.js @@ -56,7 +56,7 @@ class StreamDispatcher extends Writable { * The broadcast controlling this dispatcher, if any * @type {?VoiceBroadcast} */ - this.broadcast = this.streams.broadcast; + this.broadcast = this.streams.broadcast || null; this._pausedTime = 0; this._silentPausedTime = 0; diff --git a/src/client/websocket/WebSocketManager.js b/src/client/websocket/WebSocketManager.js index e75ca793..f892985f 100644 --- a/src/client/websocket/WebSocketManager.js +++ b/src/client/websocket/WebSocketManager.js @@ -43,7 +43,7 @@ class WebSocketManager extends EventEmitter { * The gateway this manager uses * @type {?string} */ - this.gateway = undefined; + this.gateway = null; /** * The amount of shards this manager handles @@ -98,11 +98,11 @@ class WebSocketManager extends EventEmitter { * The current session limit of the client * @private * @type {?Object} - * @prop {number} total Total number of identifies available - * @prop {number} remaining Number of identifies remaining - * @prop {number} reset_after Number of milliseconds after which the limit resets + * @property {number} total Total number of identifies available + * @property {number} remaining Number of identifies remaining + * @property {number} reset_after Number of milliseconds after which the limit resets */ - this.sessionStartLimit = undefined; + this.sessionStartLimit = null; } /** @@ -212,7 +212,7 @@ class WebSocketManager extends EventEmitter { if (UNRESUMABLE_CLOSE_CODES.includes(event.code)) { // These event codes cannot be resumed - shard.sessionID = undefined; + shard.sessionID = null; } /** diff --git a/src/client/websocket/WebSocketShard.js b/src/client/websocket/WebSocketShard.js index 2da290a5..f99c83f8 100644 --- a/src/client/websocket/WebSocketShard.js +++ b/src/client/websocket/WebSocketShard.js @@ -56,10 +56,10 @@ class WebSocketShard extends EventEmitter { /** * The current session ID of the shard - * @type {string} + * @type {?string} * @private */ - this.sessionID = undefined; + this.sessionID = null; /** * The previous heartbeat ping of the shard @@ -124,7 +124,7 @@ class WebSocketShard extends EventEmitter { * @type {?NodeJS.Timeout} * @private */ - Object.defineProperty(this, 'helloTimeout', { value: undefined, writable: true }); + Object.defineProperty(this, 'helloTimeout', { value: null, writable: true }); /** * If the manager attached its event handlers on the shard @@ -140,7 +140,7 @@ class WebSocketShard extends EventEmitter { * @type {?Set} * @private */ - Object.defineProperty(this, 'expectedGuilds', { value: undefined, writable: true }); + Object.defineProperty(this, 'expectedGuilds', { value: null, writable: true }); /** * The ready timeout @@ -148,7 +148,7 @@ class WebSocketShard extends EventEmitter { * @type {?NodeJS.Timeout} * @private */ - Object.defineProperty(this, 'readyTimeout', { value: undefined, writable: true }); + Object.defineProperty(this, 'readyTimeout', { value: null, writable: true }); /** * Time when the WebSocket connection was opened @@ -428,7 +428,7 @@ class WebSocketShard extends EventEmitter { // Reset the sequence this.sequence = -1; // Reset the session ID as it's invalid - this.sessionID = undefined; + this.sessionID = null; // Set the status to reconnecting this.status = Status.RECONNECTING; // Finally, emit the INVALID_SESSION event @@ -457,7 +457,7 @@ class WebSocketShard extends EventEmitter { // Step 0. Clear the ready timeout, if it exists if (this.readyTimeout) { this.manager.client.clearTimeout(this.readyTimeout); - this.readyTimeout = undefined; + this.readyTimeout = null; } // Step 1. If we don't have any other guilds pending, we are ready if (!this.expectedGuilds.size) { @@ -480,7 +480,7 @@ class WebSocketShard extends EventEmitter { this.debug(`Shard did not receive any more guild packets in 15 seconds. Unavailable guild count: ${this.expectedGuilds.size}`); - this.readyTimeout = undefined; + this.readyTimeout = null; this.status = Status.READY; @@ -498,7 +498,7 @@ class WebSocketShard extends EventEmitter { if (this.helloTimeout) { this.debug('Clearing the HELLO timeout.'); this.manager.client.clearTimeout(this.helloTimeout); - this.helloTimeout = undefined; + this.helloTimeout = null; } return; } @@ -519,7 +519,7 @@ class WebSocketShard extends EventEmitter { if (this.heartbeatInterval) { this.debug('Clearing the heartbeat interval.'); this.manager.client.clearInterval(this.heartbeatInterval); - this.heartbeatInterval = undefined; + this.heartbeatInterval = null; } return; } @@ -734,7 +734,7 @@ class WebSocketShard extends EventEmitter { // Step 5: Reset the sequence and session ID if requested if (reset) { this.sequence = -1; - this.sessionID = undefined; + this.sessionID = null; } // Step 6: reset the ratelimit data diff --git a/src/managers/GuildEmojiManager.js b/src/managers/GuildEmojiManager.js index c13ad132..acf3576e 100644 --- a/src/managers/GuildEmojiManager.js +++ b/src/managers/GuildEmojiManager.js @@ -6,6 +6,7 @@ const GuildEmoji = require('../structures/GuildEmoji'); const ReactionEmoji = require('../structures/ReactionEmoji'); const Collection = require('../util/Collection'); const DataResolver = require('../util/DataResolver'); +const { parseEmoji } = require('../util/Util'); /** * Manages API methods for GuildEmojis and stores their cache. @@ -105,6 +106,7 @@ class GuildEmojiManager extends BaseManager { /** * Data that can be resolved to give an emoji identifier. This can be: * * The unicode representation of an emoji + * * The ``, `<:name:id>`, `:name:id` or `a:name:id` emoji identifier string of an emoji * * An EmojiResolvable * @typedef {string|EmojiResolvable} EmojiIdentifierResolvable */ @@ -119,6 +121,10 @@ class GuildEmojiManager extends BaseManager { if (emojiResolvable) return emojiResolvable.identifier; if (emoji instanceof ReactionEmoji) return emoji.identifier; if (typeof emoji === 'string') { + const res = parseEmoji(emoji); + if (res && res.name.length) { + emoji = `${res.animated ? 'a:' : ''}${res.name}${res.id ? `:${res.id}` : ''}`; + } if (!emoji.includes('%')) return encodeURIComponent(emoji); else return emoji; } diff --git a/src/managers/GuildMemberManager.js b/src/managers/GuildMemberManager.js index 8072374b..8dfa2d8e 100644 --- a/src/managers/GuildMemberManager.js +++ b/src/managers/GuildMemberManager.js @@ -5,6 +5,7 @@ const { Error, TypeError, RangeError } = require('../errors'); const GuildMember = require('../structures/GuildMember'); const Collection = require('../util/Collection'); const { Events, OPCodes } = require('../util/Constants'); +const SnowflakeUtil = require('../util/Snowflake'); /** * Manages API methods for GuildMembers and stores their cache. @@ -161,19 +162,22 @@ class GuildMemberManager extends BaseManager { * .then(pruned => console.log(`I just pruned ${pruned} people!`)) * .catch(console.error); */ - prune({ days = 7, dry = false, count = true, roles = [], reason } = {}) { + prune({ days = 7, dry = false, count: compute_prune_count = true, roles = [], reason } = {}) { if (typeof days !== 'number') throw new TypeError('PRUNE_DAYS_TYPE'); - const query = new URLSearchParams(); - query.set('days', days); - query.set('compute_prune_count', count); + const query = { days }; + const resolvedRoles = []; for (const role of roles) { const resolvedRole = this.guild.roles.resolveID(role); if (!resolvedRole) { return Promise.reject(new TypeError('INVALID_TYPE', 'roles', 'Array of Roles or Snowflakes', true)); } - query.append('include_roles', role); + resolvedRoles.push(resolvedRole); + } + + if (resolvedRoles.length) { + query.include_roles = dry ? resolvedRoles.join(',') : resolvedRoles; } const endpoint = this.client.api.guilds(this.guild.id).prune; @@ -182,13 +186,12 @@ class GuildMemberManager extends BaseManager { return endpoint.get({ query, reason }).then(data => data.pruned); } - const body = [...query.entries()].reduce((acc, [k, v]) => { - if (k === 'include_roles') v = (acc[k] || []).concat(v); - acc[k] = v; - return acc; - }, {}); - - return endpoint.post({ data: body, reason }).then(data => data.pruned); + return endpoint + .post({ + data: { ...query, compute_prune_count }, + reason, + }) + .then(data => data.pruned); } /** @@ -263,7 +266,7 @@ class GuildMemberManager extends BaseManager { user: user_ids, query, time = 120e3, - nonce = Date.now().toString(16), + nonce = SnowflakeUtil.generate(), force = false, } = {}) { return new Promise((resolve, reject) => { diff --git a/src/sharding/Shard.js b/src/sharding/Shard.js index 797dde50..e840707c 100644 --- a/src/sharding/Shard.js +++ b/src/sharding/Shard.js @@ -44,7 +44,7 @@ class Shard extends EventEmitter { /** * Arguments for the shard's process executable (only when {@link ShardingManager#mode} is `process`) - * @type {?string[]} + * @type {string[]} */ this.execArgv = manager.execArgv; diff --git a/src/sharding/ShardClientUtil.js b/src/sharding/ShardClientUtil.js index 79345d88..292a033d 100644 --- a/src/sharding/ShardClientUtil.js +++ b/src/sharding/ShardClientUtil.js @@ -125,7 +125,7 @@ class ShardClientUtil { } /** - * Evaluates a script or function on all shards, in the context of the {@link Clients}. + * Evaluates a script or function on all shards, in the context of the {@link Client}s. * @param {string|Function} script JavaScript to run on each shard * @returns {Promise>} Results of the script execution * @example diff --git a/src/structures/Base.js b/src/structures/Base.js index 65c1fa5e..cd43bf79 100644 --- a/src/structures/Base.js +++ b/src/structures/Base.js @@ -4,6 +4,7 @@ const Util = require('../util/Util'); /** * Represents a data model that is identifiable by a Snowflake (i.e. Discord API data models). + * @abstract */ class Base { constructor(client) { diff --git a/src/structures/BaseGuildEmoji.js b/src/structures/BaseGuildEmoji.js index 3dc9819f..a2007c67 100644 --- a/src/structures/BaseGuildEmoji.js +++ b/src/structures/BaseGuildEmoji.js @@ -5,6 +5,7 @@ const Emoji = require('./Emoji'); /** * Parent class for {@link GuildEmoji} and {@link GuildPreviewEmoji}. * @extends {Emoji} + * @abstract */ class BaseGuildEmoji extends Emoji { constructor(client, data, guild) { @@ -16,6 +17,10 @@ class BaseGuildEmoji extends Emoji { */ this.guild = guild; + this.requireColons = null; + this.managed = null; + this.available = null; + /** * Array of role ids this emoji is active for * @name BaseGuildEmoji#_roles @@ -30,26 +35,29 @@ class BaseGuildEmoji extends Emoji { _patch(data) { if (data.name) this.name = data.name; - /** - * Whether or not this emoji requires colons surrounding it - * @type {?boolean} - * @name GuildEmoji#requiresColons - */ - if (typeof data.require_colons !== 'undefined') this.requiresColons = data.require_colons; + if (typeof data.require_colons !== 'undefined') { + /** + * Whether or not this emoji requires colons surrounding it + * @type {?boolean} + */ + this.requiresColons = data.require_colons; + } - /** - * Whether this emoji is managed by an external service - * @type {?boolean} - * @name GuildEmoji#managed - */ - if (typeof data.managed !== 'undefined') this.managed = data.managed; + if (typeof data.managed !== 'undefined') { + /** + * Whether this emoji is managed by an external service + * @type {?boolean} + */ + this.managed = data.managed; + } - /** - * Whether this emoji is available - * @type {?boolean} - * @name GuildEmoji#available - */ - if (typeof data.available !== 'undefined') this.available = data.available; + if (typeof data.available !== 'undefined') { + /** + * Whether this emoji is available + * @type {?boolean} + */ + this.available = data.available; + } if (data.roles) this._roles = data.roles; } diff --git a/src/structures/Channel.js b/src/structures/Channel.js index 52867c64..baa02ee6 100644 --- a/src/structures/Channel.js +++ b/src/structures/Channel.js @@ -7,6 +7,7 @@ const Snowflake = require('../util/Snowflake'); /** * Represents any channel on Discord. * @extends {Base} + * @abstract */ class Channel extends Base { constructor(client, data) { diff --git a/src/structures/ClientUser.js b/src/structures/ClientUser.js index 84ada54d..65112b8c 100644 --- a/src/structures/ClientUser.js +++ b/src/structures/ClientUser.js @@ -94,11 +94,9 @@ class ClientUser extends Structures.get('User') { * @property {PresenceStatusData} [status] Status of the user * @property {boolean} [afk] Whether the user is AFK * @property {Object} [activity] Activity the user is playing - * @property {Object|string} [activity.application] An application object or application id - * @property {string} [activity.application.id] The id of the application * @property {string} [activity.name] Name of the activity * @property {ActivityType|number} [activity.type] Type of the activity - * @property {string} [activity.url] Stream url + * @property {string} [activity.url] Twitch / YouTube stream URL * @property {?number|number[]} [shardID] Shard Id(s) to have the activity set on */ @@ -141,10 +139,10 @@ class ClientUser extends Structures.get('User') { } /** - * Options for setting an activity + * Options for setting an activity. * @typedef ActivityOptions * @type {Object} - * @property {string} [url] Twitch stream URL + * @property {string} [url] Twitch / YouTube stream URL * @property {ActivityType|number} [type] Type of the activity * @property {?number|number[]} [shardID] Shard Id(s) to have the activity set on */ diff --git a/src/structures/Guild.js b/src/structures/Guild.js index 558e57c2..664aad23 100644 --- a/src/structures/Guild.js +++ b/src/structures/Guild.js @@ -231,36 +231,38 @@ class Guild extends Base { */ this.premiumTier = data.premium_tier; - /** - * The total number of boosts for this server - * @type {?number} - * @name Guild#premiumSubscriptionCount - */ if (typeof data.premium_subscription_count !== 'undefined') { + /** + * The total number of boosts for this server + * @type {?number} + */ this.premiumSubscriptionCount = data.premium_subscription_count; } - /** - * Whether widget images are enabled on this guild - * @type {?boolean} - * @name Guild#widgetEnabled - */ - if (typeof data.widget_enabled !== 'undefined') this.widgetEnabled = data.widget_enabled; + if (typeof data.widget_enabled !== 'undefined') { + /** + * Whether widget images are enabled on this guild + * @type {?boolean} + */ + this.widgetEnabled = data.widget_enabled; + } - /** - * The widget channel ID, if enabled - * @type {?string} - * @name Guild#widgetChannelID - */ - if (typeof data.widget_channel_id !== 'undefined') this.widgetChannelID = data.widget_channel_id; + if (typeof data.widget_channel_id !== 'undefined') { + /** + * The widget channel ID, if enabled + * @type {?string} + */ + this.widgetChannelID = data.widget_channel_id; + } - /** - * The embed channel ID, if enabled - * @type {?string} - * @name Guild#embedChannelID - * @deprecated - */ - if (typeof data.embed_channel_id !== 'undefined') this.embedChannelID = data.embed_channel_id; + if (typeof data.embed_channel_id !== 'undefined') { + /** + * The embed channel ID, if enabled + * @type {?string} + * @deprecated + */ + this.embedChannelID = data.embed_channel_id; + } /** * The verification level of the guild @@ -299,40 +301,47 @@ class Guild extends Base { */ this.systemChannelFlags = new SystemChannelFlags(data.system_channel_flags).freeze(); - /** - * The maximum amount of members the guild can have - * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter - * @type {?number} - * @name Guild#maximumMembers - */ - if (typeof data.max_members !== 'undefined') this.maximumMembers = data.max_members || 250000; - - /** - * The maximum amount of presences the guild can have - * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter - * @type {?number} - * @name Guild#maximumPresences - */ - if (typeof data.max_presences !== 'undefined') this.maximumPresences = data.max_presences || 25000; - - /** - * The approximate amount of members the guild has - * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter - * @type {?number} - * @name Guild#approximateMemberCount - */ - if (typeof data.approximate_member_count !== 'undefined') { - this.approximateMemberCount = data.approximate_member_count; + if (typeof data.max_members !== 'undefined') { + /** + * The maximum amount of members the guild can have + * @type {?number} + */ + this.maximumMembers = data.max_members; + } else if (typeof this.maximumMembers === 'undefined') { + this.maximumMembers = null; + } + + if (typeof data.max_presences !== 'undefined') { + /** + * The maximum amount of presences the guild can have + * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter + * @type {?number} + */ + this.maximumPresences = data.max_presences || 25000; + } else if (typeof this.maximumPresences === 'undefined') { + this.maximumPresences = null; + } + + if (typeof data.approximate_member_count !== 'undefined') { + /** + * The approximate amount of members the guild has + * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter + * @type {?number} + */ + this.approximateMemberCount = data.approximate_member_count; + } else if (typeof this.approximateMemberCount === 'undefined') { + this.approximateMemberCount = null; } - /** - * The approximate amount of presences the guild has - * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter - * @type {?number} - * @name Guild#approximatePresenceCount - */ if (typeof data.approximate_presence_count !== 'undefined') { + /** + * The approximate amount of presences the guild has + * You will need to fetch the guild using {@link Guild#fetch} if you want to receive this parameter + * @type {?number} + */ this.approximatePresenceCount = data.approximate_presence_count; + } else if (typeof this.approximatePresenceCount === 'undefined') { + this.approximatePresenceCount = null; } /** diff --git a/src/structures/GuildAuditLogs.js b/src/structures/GuildAuditLogs.js index b3522b05..823b0037 100644 --- a/src/structures/GuildAuditLogs.js +++ b/src/structures/GuildAuditLogs.js @@ -24,7 +24,7 @@ const Util = require('../util/Util'); /** * Key mirror of all available audit log targets. * @name GuildAuditLogs.Targets - * @type {AuditLogTargetType} + * @type {Object} */ const Targets = { ALL: 'ALL', @@ -84,7 +84,7 @@ const Targets = { /** * All available actions keyed under their names to their numeric values. * @name GuildAuditLogs.Actions - * @type {AuditLogAction} + * @type {Object} */ const Actions = { ALL: null, diff --git a/src/structures/GuildChannel.js b/src/structures/GuildChannel.js index e65ad5eb..f397c3c3 100644 --- a/src/structures/GuildChannel.js +++ b/src/structures/GuildChannel.js @@ -17,6 +17,7 @@ const Util = require('../util/Util'); * - {@link NewsChannel} * - {@link StoreChannel} * @extends {Channel} + * @abstract */ class GuildChannel extends Channel { /** @@ -52,7 +53,7 @@ class GuildChannel extends Channel { * The ID of the category parent of this channel * @type {?Snowflake} */ - this.parentID = data.parent_id; + this.parentID = data.parent_id || null; /** * A map of permission overwrites in this channel for roles and users @@ -298,7 +299,7 @@ class GuildChannel extends Channel { * @property {boolean} [nsfw] Whether the channel is NSFW * @property {number} [bitrate] The bitrate of the voice channel * @property {number} [userLimit] The user limit of the voice channel - * @property {Snowflake} [parentID] The parent ID of the channel + * @property {?Snowflake} [parentID] The parent ID of the channel * @property {boolean} [lockPermissions] * Lock the permissions of the channel to what the parent's permissions are * @property {OverwriteResolvable[]|Collection} [permissionOverwrites] @@ -412,7 +413,7 @@ class GuildChannel extends Channel { /** * Sets a new topic for the guild channel. - * @param {string} topic The new topic for the guild channel + * @param {?string} topic The new topic for the guild channel * @param {string} [reason] Reason for changing the guild channel's topic * @returns {Promise} * @example diff --git a/src/structures/GuildMember.js b/src/structures/GuildMember.js index de4705ab..1bd0dfd1 100644 --- a/src/structures/GuildMember.js +++ b/src/structures/GuildMember.js @@ -61,7 +61,6 @@ class GuildMember extends Base { /** * The nickname of this member, if they have one * @type {?string} - * @name GuildMember#nickname */ this.nickname = null; @@ -74,7 +73,6 @@ class GuildMember extends Base { /** * The user that this guild member instance represents * @type {User} - * @name GuildMember#user */ this.user = this.client.users.add(data.user, true); } @@ -269,7 +267,8 @@ class GuildMember extends Base { */ hasPermission(permission, { checkAdmin = true, checkOwner = true } = {}) { if (checkOwner && this.user.id === this.guild.ownerID) return true; - return this.roles.cache.some(r => r.permissions.has(permission, checkAdmin)); + const permissions = new Permissions(this.roles.cache.map(role => role.permissions)); + return permissions.has(permission, checkAdmin); } /** diff --git a/src/structures/GuildPreview.js b/src/structures/GuildPreview.js index c2175d4e..76f53424 100644 --- a/src/structures/GuildPreview.js +++ b/src/structures/GuildPreview.js @@ -75,7 +75,7 @@ class GuildPreview extends Base { * The description for this guild * @type {?string} */ - this.description = data.description; + this.description = data.description || null; if (!this.emojis) { /** diff --git a/src/structures/Integration.js b/src/structures/Integration.js index 1c7a0d41..a48019a6 100644 --- a/src/structures/Integration.js +++ b/src/structures/Integration.js @@ -65,6 +65,8 @@ class Integration extends Base { * @type {?User} */ this.user = this.client.users.add(data.user); + } else { + this.user = null; } /** diff --git a/src/structures/Message.js b/src/structures/Message.js index c1a97384..962bd09f 100644 --- a/src/structures/Message.js +++ b/src/structures/Message.js @@ -239,13 +239,18 @@ class Message extends Base { } /** - * Updates the message. + * Updates the message and returns the old message. * @param {Object} data Raw Discord message update data + * @returns {Message} * @private */ patch(data) { const clone = this._clone(); - this._edits.unshift(clone); + const { messageEditHistoryMaxSize } = this.client.options; + if (messageEditHistoryMaxSize !== 0) { + const editsLimit = messageEditHistoryMaxSize === -1 ? Infinity : messageEditHistoryMaxSize; + if (this._edits.unshift(clone) > editsLimit) this._edits.pop(); + } if ('edited_timestamp' in data) this.editedTimestamp = new Date(data.edited_timestamp).getTime(); if ('content' in data) this.content = data.content; @@ -272,6 +277,8 @@ class Message extends Base { ); this.flags = new MessageFlags('flags' in data ? data.flags : 0).freeze(); + + return clone; } /** @@ -434,6 +441,23 @@ class Message extends Base { return referenceChannel.messages.resolve(this.reference.messageID); } + /** + * Whether the message is crosspostable by the client user + * @type {boolean} + * @readonly + */ + get crosspostable() { + return ( + this.channel.type === 'news' && + !this.flags.has(MessageFlags.FLAGS.CROSSPOSTED) && + this.type === 'DEFAULT' && + this.channel.viewable && + this.channel.permissionsFor(this.client.user).has(Permissions.FLAGS.SEND_MESSAGES) && + (this.author.id === this.client.user.id || + this.channel.permissionsFor(this.client.user).has(Permissions.FLAGS.MANAGE_MESSAGES)) + ); + } + /** * Options that can be passed into editMessage. * @typedef {Object} MessageEditOptions diff --git a/src/structures/MessageEmbed.js b/src/structures/MessageEmbed.js index b9319ed1..ef007a55 100644 --- a/src/structures/MessageEmbed.js +++ b/src/structures/MessageEmbed.js @@ -29,37 +29,37 @@ class MessageEmbed { * * `link` - a link embed * @type {string} */ - this.type = data.type; + this.type = data.type || 'rich'; /** * The title of this embed * @type {?string} */ - this.title = data.title; + this.title = 'title' in data ? data.title : null; /** * The description of this embed * @type {?string} */ - this.description = data.description; + this.description = 'description' in data ? data.description : null; /** * The URL of this embed * @type {?string} */ - this.url = data.url; + this.url = 'url' in data ? data.url : null; /** * The color of this embed * @type {?number} */ - this.color = Util.resolveColor(data.color); + this.color = 'color' in data ? Util.resolveColor(data.color) : null; /** * The timestamp of this embed * @type {?number} */ - this.timestamp = data.timestamp ? new Date(data.timestamp).getTime() : null; + this.timestamp = 'timestamp' in data ? new Date(data.timestamp).getTime() : null; /** * Represents a field of a MessageEmbed @@ -331,7 +331,7 @@ class MessageEmbed { */ setFooter(text, iconURL) { text = Util.resolveString(text); - this.footer = { text, iconURL, proxyIconURL: undefined }; + this.footer = { text, iconURL }; return this; } diff --git a/src/structures/MessageReaction.js b/src/structures/MessageReaction.js index 771626ed..ac0e04dc 100644 --- a/src/structures/MessageReaction.js +++ b/src/structures/MessageReaction.js @@ -46,13 +46,14 @@ class MessageReaction { } _patch(data) { - /** - * The number of people that have given the same reaction - * @type {?number} - * @name MessageReaction#count - */ // eslint-disable-next-line eqeqeq - if (this.count == undefined) this.count = data.count; + if (this.count == undefined) { + /** + * The number of people that have given the same reaction + * @type {?number} + */ + this.count = data.count; + } } /** diff --git a/src/structures/Presence.js b/src/structures/Presence.js index ac07a543..2ae6b8c0 100644 --- a/src/structures/Presence.js +++ b/src/structures/Presence.js @@ -184,8 +184,8 @@ class Activity { /** * Timestamps for the activity * @type {?Object} - * @prop {?Date} start When the activity started - * @prop {?Date} end When the activity will end + * @property {?Date} start When the activity started + * @property {?Date} end When the activity will end */ this.timestamps = data.timestamps ? { @@ -197,8 +197,8 @@ class Activity { /** * Party of the activity * @type {?Object} - * @prop {?string} id ID of the party - * @prop {number[]} size Size of the party as `[current, max]` + * @property {?string} id ID of the party + * @property {number[]} size Size of the party as `[current, max]` */ this.party = data.party || null; diff --git a/src/structures/User.js b/src/structures/User.js index bcc73016..f99bf6d1 100644 --- a/src/structures/User.js +++ b/src/structures/User.js @@ -27,6 +27,10 @@ class User extends Base { */ this.id = data.id; + this.system = null; + this.locale = null; + this.flags = null; + this._patch(data); } @@ -35,7 +39,6 @@ class User extends Base { /** * The username of the user * @type {?string} - * @name User#username */ this.username = data.username; } else if (typeof this.username !== 'string') { @@ -45,7 +48,6 @@ class User extends Base { /** * Whether or not the user is a bot * @type {boolean} - * @name User#bot */ this.bot = Boolean(data.bot); @@ -53,7 +55,6 @@ class User extends Base { /** * A discriminator based on username for the user * @type {?string} - * @name User#discriminator */ this.discriminator = data.discriminator; } else if (typeof this.discriminator !== 'string') { @@ -64,7 +65,6 @@ class User extends Base { /** * The ID of the user's avatar * @type {?string} - * @name User#avatar */ this.avatar = data.avatar; } else if (typeof this.avatar !== 'string') { @@ -75,7 +75,6 @@ class User extends Base { /** * Whether the user is an Official Discord System user (part of the urgent message system) * @type {?boolean} - * @name User#system */ this.system = Boolean(data.system); } @@ -84,7 +83,6 @@ class User extends Base { /** * The locale of the user's client (ISO 639-1) * @type {?string} - * @name User#locale */ this.locale = data.locale; } @@ -93,7 +91,6 @@ class User extends Base { /** * The flags for this user * @type {?UserFlags} - * @name User#flags */ this.flags = new UserFlags(data.public_flags); } diff --git a/src/structures/VoiceChannel.js b/src/structures/VoiceChannel.js index 6fb5ab78..2b9eb9e1 100644 --- a/src/structures/VoiceChannel.js +++ b/src/structures/VoiceChannel.js @@ -29,7 +29,6 @@ class VoiceChannel extends GuildChannel { /** * The members in this voice channel * @type {Collection} - * @name VoiceChannel#members * @readonly */ get members() { diff --git a/src/structures/VoiceState.js b/src/structures/VoiceState.js index 2854d94d..731c7ef4 100644 --- a/src/structures/VoiceState.js +++ b/src/structures/VoiceState.js @@ -32,32 +32,32 @@ class VoiceState extends Base { * Whether this member is deafened server-wide * @type {?boolean} */ - this.serverDeaf = data.deaf; + this.serverDeaf = 'deaf' in data ? data.deaf : null; /** * Whether this member is muted server-wide * @type {?boolean} */ - this.serverMute = data.mute; + this.serverMute = 'mute' in data ? data.mute : null; /** * Whether this member is self-deafened * @type {?boolean} */ - this.selfDeaf = data.self_deaf; + this.selfDeaf = 'self_deaf' in data ? data.self_deaf : null; /** * Whether this member is self-muted * @type {?boolean} */ - this.selfMute = data.self_mute; + this.selfMute = 'self_mute' in data ? data.self_mute : null; /** * Whether this member's camera is enabled - * @type {boolean} + * @type {?boolean} */ - this.selfVideo = data.self_video; + this.selfVideo = 'self_video' in data ? data.self_video : null; /** * The session ID of this member's connection * @type {?string} */ - this.sessionID = data.session_id; + this.sessionID = 'session_id' in data ? data.session_id : null; /** * Whether this member is streaming using "Go Live" * @type {boolean} @@ -67,7 +67,7 @@ class VoiceState extends Base { * The ID of the voice channel that this member is in * @type {?Snowflake} */ - this.channelID = data.channel_id; + this.channelID = data.channel_id || null; return this; } diff --git a/src/util/Constants.js b/src/util/Constants.js index 1386c9fa..7ef8f41b 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -19,6 +19,8 @@ const browser = (exports.browser = typeof window !== 'undefined'); * sweepable (in seconds, 0 for forever) * @property {number} [messageSweepInterval=0] How frequently to remove messages from the cache that are older than * the message cache lifetime (in seconds, 0 for never) + * @property {number} [messageEditHistoryMaxSize=-1] Maximum number of previous versions to hold for an edited message + * (-1 or Infinity for unlimited - don't do this without sweeping, otherwise memory usage may climb indefinitely.) * @property {boolean} [fetchAllMembers=false] Whether to cache all guild members and users upon startup, as well as * upon joining a guild (should be avoided whenever possible) * @property {DisableMentionType} [disableMentions='none'] Default value for {@link MessageOptions#disableMentions} @@ -43,6 +45,7 @@ exports.DefaultOptions = { messageCacheMaxSize: 200, messageCacheLifetime: 0, messageSweepInterval: 0, + messageEditHistoryMaxSize: -1, fetchAllMembers: false, disableMentions: 'none', partials: [], diff --git a/typings/index.d.ts b/typings/index.d.ts index 329bcd0b..9b791584 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -29,6 +29,7 @@ declare module 'discord.js' { public createdTimestamp: number; public details: string | null; public emoji: Emoji | null; + public flags: Readonly; public name: string; public party: { id: string | null; @@ -141,13 +142,13 @@ declare module 'discord.js' { constructor(client: Client, data: object, guild: Guild); private _roles: string[]; - public available?: boolean; + public available: boolean | null; public readonly createdAt: Date; public readonly createdTimestamp: number; public guild: Guild | GuildPreview; public id: Snowflake; - public managed?: boolean; - public requiresColons?: boolean; + public managed: boolean | null; + public requiresColons: boolean | null; } class BroadcastDispatcher extends VolumeMixin(StreamDispatcher) { @@ -624,8 +625,8 @@ declare module 'discord.js' { public afkChannelID: Snowflake | null; public afkTimeout: number; public applicationID: Snowflake | null; - public approximateMemberCount?: number; - public approximatePresenceCount?: number; + public approximateMemberCount: number | null; + public approximatePresenceCount: number | null; public available: boolean; public banner: string | null; public channels: GuildChannelManager; @@ -817,11 +818,11 @@ declare module 'discord.js' { public permissionsFor(memberOrRole: GuildMemberResolvable | RoleResolvable): Readonly | null; public setName(name: string, reason?: string): Promise; public setParent( - channel: CategoryChannel | Snowflake, + channel: CategoryChannel | Snowflake | null, options?: { lockPermissions?: boolean; reason?: string }, ): Promise; public setPosition(position: number, options?: { relative?: boolean; reason?: string }): Promise; - public setTopic(topic: string, reason?: string): Promise; + public setTopic(topic: string | null, reason?: string): Promise; public updateOverwrite( userOrRole: RoleResolvable | UserResolvable, options: PermissionOverwriteOption, @@ -887,7 +888,7 @@ declare module 'discord.js' { constructor(client: Client, data: object); public approximateMemberCount: number; public approximatePresenceCount: number; - public description?: string; + public description: string | null; public discoverySplash: string | null; public emojis: Collection; public features: GuildFeatures[]; @@ -931,7 +932,7 @@ declare module 'discord.js' { public syncedAt: number; public syncing: boolean; public type: string; - public user?: User; + public user: User | null; public delete(reason?: string): Promise; public edit(data: IntegrationEditData, reason?: string): Promise; public sync(): Promise; @@ -977,7 +978,7 @@ declare module 'discord.js' { export class Message extends Base { constructor(client: Client, data: object, channel: TextChannel | DMChannel | NewsChannel); private _edits: Message[]; - private patch(data: object): void; + private patch(data: object): Message; public activity: MessageActivity | null; public application: ClientApplication | null; @@ -1054,7 +1055,7 @@ declare module 'discord.js' { public attachment: BufferResolvable | Stream; public height: number | null; public id: Snowflake; - public name?: string; + public name: string | null; public proxyURL: string; public size: number; public readonly spoiler: boolean; @@ -1082,9 +1083,9 @@ declare module 'discord.js' { export class MessageEmbed { constructor(data?: MessageEmbed | MessageEmbedOptions); public author: MessageEmbedAuthor | null; - public color?: number; + public color: number | null; public readonly createdAt: Date | null; - public description?: string; + public description: string | null; public fields: EmbedField[]; public files: (MessageAttachment | string | FileOptions)[]; public footer: MessageEmbedFooter | null; @@ -1094,9 +1095,9 @@ declare module 'discord.js' { public provider: MessageEmbedProvider | null; public thumbnail: MessageEmbedThumbnail | null; public timestamp: number | null; - public title?: string; + public title: string | null; public type: string; - public url?: string; + public url: string | null; public readonly video: MessageEmbedVideo | null; public addField(name: StringResolvable, value: StringResolvable, inline?: boolean): this; public addFields(...fields: EmbedFieldData[] | EmbedFieldData[][]): this; @@ -1232,7 +1233,6 @@ declare module 'discord.js' { constructor(client: Client, data?: object); public activities: Activity[]; public clientStatus: ClientPresenceStatusData | null; - public flags: Readonly; public guild: Guild | null; public readonly member: GuildMember | null; public status: PresenceStatus; @@ -1541,13 +1541,13 @@ declare module 'discord.js' { public discriminator: string; public readonly defaultAvatarURL: string; public readonly dmChannel: DMChannel | null; - public flags?: Readonly; + public flags: Readonly | null; public id: Snowflake; public lastMessageID: Snowflake | null; - public locale?: string; + public locale: string | null; public readonly partial: false; public readonly presence: Presence; - public system?: boolean; + public system: boolean | null; public readonly tag: string; public username: string; public avatarURL(options?: ImageURLOptions & { dynamic?: boolean }): string | null; @@ -1614,7 +1614,7 @@ declare module 'discord.js' { constructor(client: Client); public client: Client; public subscribers: StreamDispatcher[]; - public readonly dispatcher?: BroadcastDispatcher; + public readonly dispatcher: BroadcastDispatcher | null; public play(input: string | Readable, options?: StreamOptions): BroadcastDispatcher; public end(): void; @@ -1670,7 +1670,7 @@ declare module 'discord.js' { public receiver: VoiceReceiver; public speaking: Readonly; public status: VoiceStatus; - public readonly voice: VoiceState; + public readonly voice: VoiceState | null; public voiceManager: ClientVoiceManager; public disconnect(): void; public play(input: VoiceBroadcast | Readable | string, options?: StreamOptions): StreamDispatcher; @@ -1722,18 +1722,18 @@ declare module 'discord.js' { export class VoiceState extends Base { constructor(guild: Guild, data: object); public readonly channel: VoiceChannel | null; - public channelID?: Snowflake; + public channelID: Snowflake | null; public readonly connection: VoiceConnection | null; - public readonly deaf?: boolean; + public readonly deaf: boolean | null; public guild: Guild; public id: Snowflake; public readonly member: GuildMember | null; - public readonly mute?: boolean; - public selfDeaf?: boolean; - public selfMute?: boolean; - public serverDeaf?: boolean; - public serverMute?: boolean; - public sessionID?: string; + public readonly mute: boolean | null; + public selfDeaf: boolean | null; + public selfMute: boolean | null; + public serverDeaf: boolean | null; + public serverMute: boolean | null; + public sessionID: string | null; public streaming: boolean; public selfVideo: boolean; public readonly speaking: boolean | null; @@ -1787,10 +1787,10 @@ declare module 'discord.js' { private packetQueue: object[]; private destroyed: boolean; private reconnecting: boolean; - private sessionStartLimit?: { total: number; remaining: number; reset_after: number }; + private sessionStartLimit: { total: number; remaining: number; reset_after: number } | null; public readonly client: Client; - public gateway?: string; + public gateway: string | null; public shards: Collection; public status: Status; public readonly ping: number; @@ -1814,15 +1814,15 @@ declare module 'discord.js' { constructor(manager: WebSocketManager, id: number); private sequence: number; private closeSequence: number; - private sessionID?: string; + private sessionID: string | null; private lastPingTimestamp: number; private lastHeartbeatAcked: boolean; private ratelimit: { queue: object[]; total: number; remaining: number; time: 60e3; timer: NodeJS.Timeout | null }; private connection: WebSocket | null; - private helloTimeout: NodeJS.Timeout | undefined; + private helloTimeout: NodeJS.Timeout | null; private eventsAttached: boolean; - private expectedGuilds: Set | undefined; - private readyTimeout: NodeJS.Timeout | undefined; + private expectedGuilds: Set | null; + private readyTimeout: NodeJS.Timeout | null; public manager: WebSocketManager; public id: number; @@ -2072,7 +2072,7 @@ declare module 'discord.js' { interface TextBasedChannelFields extends PartialTextBasedChannelFields { _typing: Map; lastPinTimestamp: number | null; - readonly lastPinAt: Date; + readonly lastPinAt: Date | null; typing: boolean; typingCount: number; awaitMessages(filter: CollectorFilter, options?: AwaitMessagesOptions): Promise>; @@ -2235,7 +2235,7 @@ declare module 'discord.js' { nsfw?: boolean; bitrate?: number; userLimit?: number; - parentID?: Snowflake; + parentID?: Snowflake | null; rateLimitPerUser?: number; lockPermissions?: boolean; permissionOverwrites?: readonly OverwriteResolvable[] | Collection; @@ -2318,6 +2318,7 @@ declare module 'discord.js' { messageCacheMaxSize?: number; messageCacheLifetime?: number; messageSweepInterval?: number; + messageEditHistoryMaxSize?: number; fetchAllMembers?: boolean; disableMentions?: 'none' | 'all' | 'everyone'; allowedMentions?: MessageMentionOptions; @@ -3020,6 +3021,7 @@ declare module 'discord.js' { | 'attachments' | 'channel' | 'deletable' + | 'crosspostable' | 'editable' | 'mentions' | 'pinnable' @@ -3031,6 +3033,7 @@ declare module 'discord.js' { attachments: Message['attachments']; channel: Message['channel']; readonly deletable: boolean; + readonly crosspostable: boolean; readonly editable: boolean; readonly edits: Message['edits']; embeds: Message['embeds'];