diff --git a/.eslintrc.js b/.eslintrc.js index 97d7070..b835195 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -11,7 +11,7 @@ module.exports = { 'SharedArrayBuffer': 'readonly' }, 'parserOptions': { - 'ecmaVersion': 2018 + 'ecmaVersion': 2021 }, 'rules': { 'indent': [ diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e39c070..75d82e1 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -4,26 +4,20 @@ ### Submitting a bug report -To submit a bug report, please use the "Bug report" template when creating a [new issue](https://github.com/eartharoid/DiscordTickets/issues/new/choose). Describe the bug in as much detail as possible, including how to reproduce the problem, using screenshots or code snippets if possible. Check that someone hasn't already filed an issue before creating another, you can comment on it if you want. +To submit a bug report, please use the "Bug report" template when creating a [new issue](https://github.com/eartharoid/DiscordTickets/issues/new/choose). Describe the bug in as much detail as possible, including how to reproduce the problem, using screenshots or code snippets if possible. Check that someone else hasn't already created a similar first. ### Submitting a feature request -To submit a new feature request, please use the "Feature request" template when creating a [new issue](https://github.com/eartharoid/DiscordTickets/issues/new/choose). +~~To submit a new feature request, please use the "Feature request" template when creating a [new issue](https://github.com/eartharoid/DiscordTickets/issues/new/choose).~~ + +You can request new features on [Feedbacky](https://app.feedbacky.net/b/dsctickets/). ### Submitting other issues -For issues not related to feature requests or bugs, you can [create a blank issue](https://github.com/eartharoid/DiscordTickets/issues/new). Please give us as much information as possible. If you just want to talk, you can join the [Discord server](https://github.com/eartharoid/DiscordTickets#support). +For issues not related to feature requests or bugs, you can [create a blank issue](https://github.com/eartharoid/DiscordTickets/issues/new). Please give us as much information as possible. If you just want to talk (if you need help or have questions), you can join the [Discord server](https://go.eartharoid.me/discord) or use the [Discussions tab](https://github.com/eartharoid/DiscordTickets/discussions). ## Submitting a pull request To contribute code to this project, create a new [pull request](https://github.com/eartharoid/DiscordTickets/pulls). For anything other than patches (bug fixes, documentation or minor code changes that have no affect on usage), such as a new feature, please create a [new issue](https://github.com/eartharoid/DiscordTickets/issues/new/choose) first, describing what you intend to change and why. Please ensure you update the documentation if needed. When contributing, you should follow the same code style already used throughout, to ensure code is consistent. - -1. Use single quote marks (`'`) when possible -2. Template literals are preferred -3. Commas should always have a space after them -4. Use tabs, not spaces, and always indent -5. Use arrow functions - -**Note**: Create `user/dev.env` and `user/dev.config.js` for testing. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a831253..9e7e818 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,23 +1,23 @@ --- name: Bug report -about: Report an issue or bug -title: '' -labels: '' +about: Report a bug +title: '[BUG] ' +labels: 'bug' assignees: '' --- **Describe the bug** -A clear and concise description of what the bug is. + -**To Reproduce** -Steps to reproduce the behaviour: +**To reproduce** + **Expected behavior** -A clear and concise description of what you expected to happen. + **Screenshots** -If applicable, add screenshots to help explain your problem. + **Additional context** -Add any other context about the problem here. + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 0214585..df88356 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,20 +1,24 @@ --- name: Feature request about: Suggest an idea for this project -title: '' -labels: '' +title: '[FEATURE] ' +labels: 'feature_request' assignees: '' --- -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. + + +**Is your feature request related to a problem?** + **Describe the solution you'd like** -A clear and concise description of what you want to happen. + **Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. + **Additional context** -Add any other context or screenshots about the feature request here. + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index efdfeaf..11aa112 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,22 +1,28 @@ + + #### Information -> Check one + - [ ] This includes major changes (breaking changes) - [ ] This includes minor changes (minimal usage changes, minor new features) -- [ ] This includes patches (bug fixes, documentation changes etc) +- [ ] This includes patches (bug or typo fixes) +- [ ] This is includes **only** documentation changes #### Is this related to an issue? -> Reference any issues here + #### Changes made -> Describe your changes + #### Confirmations -> Check all that apply + - [ ] I have updated any necessary documentation - [ ] This uses consistent code style diff --git a/.github/SECURITY.md b/.github/SECURITY.md index ee39dd1..e9d3f70 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -1,14 +1,15 @@ -# Security Policy +# Security policy -## Supported Versions +## Supported versions Release versions that will receive security updates. -| Version | Supported | -| ------- | ------------------ | -| 2.x | ✅ | -| < 2.0 | ❌ | +| Version | Supported | +| ------- | -------------- | +| 3.x | ✅ | +| 2.x | ⚠️ Deprecated | +| < 2.0 | ❌ | -## Reporting a Vulnerability +## Reporting a vulnerability If you find a vulnerability, please [email me](mailto:contact@eartharoid.me). diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..9830f32 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,15 @@ +name: Build and deploy docs +on: + push: + branches: + - master +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: pip install -r requirements.txt + - run: mkdocs gh-deploy --force diff --git a/.gitignore b/.gitignore index 7a35e15..073fe01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ -logs/ +# directories .vscode/ node_modules/ -user/dev.env -user/dev.config.js -user/storage.db -user/transcripts/text/*.txt -user/transcripts/raw/*.log -user/transcripts/raw/entities/*.json +logs/ +site/ + +# files +.env +user/config.js *.code-workspace diff --git a/README.md b/README.md index eb6afca..7e0f003 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +# Please download from [releases](https://github.com/eartharoid/DiscordTickets/releases) or [v2 branch](https://github.com/eartharoid/DiscordTickets/tree/v2) - master branch is currently a work in progress # DiscordTickets [![Run on Repl.it](https://repl.it/badge/github/eartharoid/DiscordTickets)](https://repl.it/github/eartharoid/DiscordTickets) [![GitHub issues](https://img.shields.io/github/issues/eartharoid/DiscordTickets?style=flat-square)](https://github.com/eartharoid/DiscordTickets/issues) [![GitHub stars](https://img.shields.io/github/stars/eartharoid/DiscordTickets?style=flat-square)](https://github.com/eartharoid/DiscordTickets/stargazers) [![GitHub forks](https://img.shields.io/github/forks/eartharoid/DiscordTickets?style=flat-square)](https://github.com/eartharoid/DiscordTickets/network) [![GitHub license](https://img.shields.io/github/license/eartharoid/DiscordTickets?style=flat-square)](https://github.com/eartharoid/DiscordTickets/blob/master/LICENSE) ![Codacy grade](https://img.shields.io/codacy/grade/14e6851c85444424b75b8bc3f93e93db?logo=codacy&style=flat-square) [![Discord support server](https://discordapp.com/api/guilds/451745464480432129/embed.png?style=shield)](https://discord.gg/pXc9vyC) diff --git a/docs/.pages b/docs/.pages new file mode 100644 index 0000000..95182e0 --- /dev/null +++ b/docs/.pages @@ -0,0 +1,3 @@ +arrange: + - index.md + - ... \ No newline at end of file diff --git a/docs/README b/docs/README new file mode 100644 index 0000000..f799806 --- /dev/null +++ b/docs/README @@ -0,0 +1 @@ +This documentation is intended to be access through the website (https://eartharoid.github.io/discordtickets) \ No newline at end of file diff --git a/user/transcripts/raw/.gitkeep b/docs/changelog.md similarity index 100% rename from user/transcripts/raw/.gitkeep rename to docs/changelog.md diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico new file mode 100644 index 0000000..42c575c Binary files /dev/null and b/docs/img/favicon.ico differ diff --git a/docs/img/logo.png b/docs/img/logo.png new file mode 100644 index 0000000..c600d2b Binary files /dev/null and b/docs/img/logo.png differ diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..ce31d28 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +# Home \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..f2d712a --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,24 @@ +a code { + color: var(--md-primary-fg-color) !important; + background-color: rgba(213, 0, 44, 0.1) !important; + transition: color 125ms; + transition: background-color 125ms +} + +a code:hover { + /* ONLY WORKS ON SLATE THEME + color: #81E8ED !important; + background-color: rgba(129, 232, 237, 0.1) !important; */ + color: var(--md-primary-fg-color--dark) !important; +} + +.md-announce { + background-color: var(--md-primary-fg-color--dark) !important; + color: white; +} + +.md-announce a, .md-announce a:hover { + color: white !important; + /* text-decoration: underline; */ + font-weight: bold; +} \ No newline at end of file diff --git a/example.env b/example.env new file mode 100644 index 0000000..08407e0 --- /dev/null +++ b/example.env @@ -0,0 +1,6 @@ +DISCORD_TOKEN= + +DB_HOST= +DB_NAME= +DB_USER= +DB_PASS= \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..b2d568c --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,82 @@ +# Project information +site_name: DiscordTickets +site_description: An open-source & self-hosted Discord bot for ticket management. +site_author: eartharoid +site_url: https://eartharoid.github.io/discordtickets + +# Repository +repo_name: eartharoid/DiscordTickets +repo_url: https://github.com/eartharoid/DiscordTickets +edit_uri: blob/master/docs/ + +# Copyright +copyright: '© 2021 Isaac Saunders' + +# Configuration +extra_css: + - stylesheets/extra.css + +theme: + name: material + language: en + + custom_dir: overrides/ + + palette: + scheme: default + primary: primary + accent: primary + + font: + text: Roboto + code: Roboto Mono + + features: + - instant + - tabs + - navigation.expand + + logo: /img/logo.png + favicon: /img/favicon.ico + +# Extras +extra: + social: + - icon: fontawesome/brands/github-alt + link: https://github.com/eartharoid + - icon: fontawesome/brands/twitter + link: https://twitter.com/eartharoid + +plugins: + - search # necessary for search to work + - git-revision-date-localized # last modified date at bottom of page + - awesome-pages # custom nav order + +# Extensions +markdown_extensions: + - admonition + - codehilite: + guess_lang: false + - toc: + permalink: true + - footnotes + - meta +# pymd + - pymdownx.arithmatex + - pymdownx.betterem: + smart_enable: all + - pymdownx.caret + - pymdownx.critic + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + - pymdownx.inlinehilite + - pymdownx.magiclink + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.superfences + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.tabbed + - pymdownx.tilde diff --git a/overrides/announce.html b/overrides/announce.html new file mode 100644 index 0000000..f93988a --- /dev/null +++ b/overrides/announce.html @@ -0,0 +1,2 @@ +{% include ".icons/material/alert-decagram.svg" %} +See what's new in v3.0. \ No newline at end of file diff --git a/overrides/main.html b/overrides/main.html new file mode 100644 index 0000000..674c9d8 --- /dev/null +++ b/overrides/main.html @@ -0,0 +1,2 @@ +{% extends "base.html" %} +{% block announce %}{% include "announce.html" ignore missing %}{% endblock %} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7d4ccbf..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2915 +0,0 @@ -{ - "name": "@eartharoid/discordtickets", - "version": "2.1.3", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@discordjs/collection": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", - "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" - }, - "@discordjs/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "@eartharoid/dtf": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@eartharoid/dtf/-/dtf-1.0.8.tgz", - "integrity": "sha512-e3mR8JY6Uuy1Zj89iYEZfvK6s81GlWEPP4gO8NzfItzF4xFGFTVTwRjZ6sCVBmbhj3ouX2pyvx8O9snx4r5Xrg==" - }, - "@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "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", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - } - } - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@types/node": { - "version": "14.14.22", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", - "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "requires": { - "type-fest": "^0.11.0" - }, - "dependencies": { - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - } - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "optional": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "optional": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "optional": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "optional": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - } - } - }, - "bignumber.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", - "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boxen": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.0.tgz", - "integrity": "sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chokidar": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", - "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "optional": true - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "discord.js": { - "version": "12.5.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.1.tgz", - "integrity": "sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w==", - "requires": { - "@discordjs/collection": "^0.1.6", - "@discordjs/form-data": "^3.0.1", - "abort-controller": "^3.0.0", - "node-fetch": "^2.6.1", - "prism-media": "^1.2.2", - "setimmediate": "^1.0.5", - "tweetnacl": "^1.0.3", - "ws": "^7.3.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" - }, - "dottie": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", - "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", - "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "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", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "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.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "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 - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", - "dev": true, - "requires": { - "estraverse": "^5.1.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 - } - } - }, - "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 - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "optional": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "optional": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "optional": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - }, - "dependencies": { - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - } - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "optional": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "optional": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "optional": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "leeks.js": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/leeks.js/-/leeks.js-0.0.9.tgz", - "integrity": "sha512-e6UVJ1fj8f2clpHy+KpXVWVxjzB3XYFGyKRJHDlT8Gy/75BT+9bYUacpHSCoXp7RTtyMSr4eBjZrp0nHyyQVbg==" - }, - "leekslazylogger": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/leekslazylogger/-/leekslazylogger-2.0.7.tgz", - "integrity": "sha512-HC0kNjPSOAKx4L9HwmKuvJp1OQQgS6U2IjXq6plKc845TcaAFRNw/2ILHze29z+fPn+44xUeI49FrLuVgSUL/A==", - "requires": { - "@eartharoid/dtf": "^1.0.8", - "leeks.js": "0.0.9", - "lodash.merge": "^4.6.2" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "moment-timezone": { - "version": "0.5.32", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", - "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", - "requires": { - "moment": ">= 2.9.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "n-readlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/n-readlines/-/n-readlines-1.0.1.tgz", - "integrity": "sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "needle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", - "integrity": "sha512-o/qITSDR0JCyCKEQ1/1bnUXMmznxabbwi/Y4WwJElf+evwJNFNwIDMCCt5IigFVxgeGBJESLohGtIS9gEzo1fA==", - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "node-addon-api": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", - "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==", - "optional": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "optional": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "optional": true, - "requires": { - "abbrev": "1" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "optional": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "optional": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-pre-gyp": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", - "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "optional": true - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - } - } - }, - "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", - "dev": true, - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "optional": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "prism-media": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.2.2.tgz", - "integrity": "sha512-I+nkWY212lJ500jLe4tN9tWO7nRiBAVdMv76P9kffZjYhw20raMlW1HSSvS+MLXC9MmbNZCazMrAr+5jEEgTuw==" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "optional": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "optional": true - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "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, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "optional": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "optional": true - } - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "retry-as-promised": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", - "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", - "requires": { - "any-promise": "^1.3.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "sequelize": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.5.0.tgz", - "integrity": "sha512-owBt8fnzVy8E1OvyCyfCdVk7OOLyPVrBCMEf+CvRReC5oCyo+UqeXCtwaex9L6LM9ifZ1i3TG3sFeM5MgLK0CQ==", - "requires": { - "debug": "^4.1.1", - "dottie": "^2.0.0", - "inflection": "1.12.0", - "lodash": "^4.17.20", - "moment": "^2.26.0", - "moment-timezone": "^0.5.31", - "retry-as-promised": "^3.2.0", - "semver": "^7.3.2", - "sequelize-pool": "^6.0.0", - "toposort-class": "^1.0.1", - "uuid": "^8.1.0", - "validator": "^10.11.0", - "wkx": "^0.5.0" - }, - "dependencies": { - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - } - } - }, - "sequelize-pool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", - "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sqlite3": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", - "integrity": "sha512-rjvqHFUaSGnzxDy2AHCwhHy6Zp6MNJzCPGYju4kD8yi6bze4d1/zMTg6C7JI49b7/EM7jKMTvyfN/4ylBKdwfw==", - "optional": true, - "requires": { - "node-addon-api": "2.0.0", - "node-gyp": "3.x", - "node-pre-gyp": "^0.11.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - } - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", - "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", - "dev": true, - "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", - "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "to-time-monthsfork": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/to-time-monthsfork/-/to-time-monthsfork-1.1.3.tgz", - "integrity": "sha512-SykQ/IAyihZJVtQUjB04ThztVYdQBFx9birBLyCm6i62bZJx8GiuDVis/l9VBPWWsz5NuT5gr7HCrrAb/2OIEg==", - "requires": { - "bignumber.js": "^2.4.0" - } - }, - "toposort-class": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", - "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "optional": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", - "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", - "dev": true - }, - "validator": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", - "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "optional": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - } - }, - "wkx": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", - "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", - "requires": { - "@types/node": "*" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", - "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "optional": true - } - } -} diff --git a/package.json b/package.json index f72174e..47f093a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@eartharoid/discordtickets", - "version": "2.1.3", + "version": "3.0.0", "private": true, "description": "An open-source & self-hosted Discord bot for ticket management.", "main": "src/index.js", @@ -34,7 +34,7 @@ "test": "echo \"Nothing to test! Run with 'npm start'\" && exit 1" }, "engines": { - "node": ">=12" + "node": ">=14" }, "repository": { "type": "git", @@ -42,8 +42,8 @@ }, "keywords": [ "discord", - "bot", - "tickets" + "tickets", + "bot" ], "author": "eartharoid", "license": "GPL-3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..7295c24 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2462 @@ +dependencies: + '@eartharoid/dtf': 1.0.8 + boxen: 5.0.0 + discord.js: 12.5.1 + dotenv: 8.2.0 + leekslazylogger: 2.0.7 + n-readlines: 1.0.1 + node-fetch: 2.6.1 + sequelize: 6.5.0_sqlite3@5.0.1 + terminal-link: 2.1.1 + to-time-monthsfork: 1.1.4 +devDependencies: + eslint: 7.20.0 + nodemon: 2.0.7 +lockfileVersion: 5.2 +optionalDependencies: + sqlite3: 5.0.1 +packages: + /@babel/code-frame/7.12.11: + dependencies: + '@babel/highlight': 7.12.13 + dev: true + resolution: + integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + /@babel/helper-validator-identifier/7.12.11: + dev: true + resolution: + integrity: sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + /@babel/highlight/7.12.13: + dependencies: + '@babel/helper-validator-identifier': 7.12.11 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + resolution: + integrity: sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + /@discordjs/collection/0.1.6: + dev: false + resolution: + integrity: sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ== + /@discordjs/form-data/3.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.28 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg== + /@eartharoid/dtf/1.0.8: + dev: false + resolution: + integrity: sha512-e3mR8JY6Uuy1Zj89iYEZfvK6s81GlWEPP4gO8NzfItzF4xFGFTVTwRjZ6sCVBmbhj3ouX2pyvx8O9snx4r5Xrg== + /@eslint/eslintrc/0.3.0: + dependencies: + ajv: 6.12.6 + debug: 4.3.1 + espree: 7.3.1 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + lodash: 4.17.20 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg== + /@sindresorhus/is/0.14.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + /@szmarczak/http-timer/1.1.2: + dependencies: + defer-to-connect: 1.1.3 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + /@types/node/14.14.28: + dev: false + resolution: + integrity: sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g== + /abbrev/1.1.1: + resolution: + integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + /abort-controller/3.0.0: + dependencies: + event-target-shim: 5.0.1 + dev: false + engines: + node: '>=6.5' + resolution: + integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + /acorn-jsx/5.3.1_acorn@7.4.1: + dependencies: + acorn: 7.4.1 + dev: true + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + resolution: + integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + /acorn/7.4.1: + dev: true + engines: + node: '>=0.4.0' + hasBin: true + resolution: + integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + /ajv/6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + resolution: + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + /ajv/7.1.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + resolution: + integrity: sha512-svS9uILze/cXbH0z2myCK2Brqprx/+JJYK5pHicT/GQiBfzzhUVAIT6MwqJg8y4xV/zoGsUeuPuwtoiKSGE15g== + /ansi-align/3.0.0: + dependencies: + string-width: 3.1.0 + resolution: + integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== + /ansi-colors/4.1.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + /ansi-escapes/4.3.1: + dependencies: + type-fest: 0.11.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + /ansi-regex/2.1.1: + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + /ansi-regex/4.1.0: + engines: + node: '>=6' + resolution: + integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + /ansi-regex/5.0.0: + engines: + node: '>=8' + resolution: + integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /ansi-styles/4.3.0: + dependencies: + color-convert: 2.0.1 + engines: + node: '>=8' + resolution: + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + /any-promise/1.3.0: + dev: false + resolution: + integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8= + /anymatch/3.1.1: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.2.2 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + /aproba/1.2.0: + dev: false + optional: true + resolution: + integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + /are-we-there-yet/1.1.5: + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.7 + dev: false + optional: true + resolution: + integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + /argparse/1.0.10: + dependencies: + sprintf-js: 1.0.3 + dev: true + resolution: + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + /asn1/0.2.4: + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + resolution: + integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + /assert-plus/1.0.0: + dev: false + engines: + node: '>=0.8' + optional: true + resolution: + integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + /astral-regex/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + /asynckit/0.4.0: + dev: false + resolution: + integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= + /aws-sign2/0.7.0: + dev: false + optional: true + resolution: + integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + /aws4/1.11.0: + dev: false + optional: true + resolution: + integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + /balanced-match/1.0.0: + resolution: + integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /bcrypt-pbkdf/1.0.2: + dependencies: + tweetnacl: 0.14.5 + dev: false + optional: true + resolution: + integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + /bignumber.js/2.4.0: + dev: false + resolution: + integrity: sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg= + /binary-extensions/2.2.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + /block-stream/0.0.9: + dependencies: + inherits: 2.0.4 + dev: false + engines: + node: 0.4 || >=0.5.8 + optional: true + resolution: + integrity: sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= + /boxen/4.2.0: + dependencies: + ansi-align: 3.0.0 + camelcase: 5.3.1 + chalk: 3.0.0 + cli-boxes: 2.2.1 + string-width: 4.2.0 + term-size: 2.2.1 + type-fest: 0.8.1 + widest-line: 3.1.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== + /boxen/5.0.0: + dependencies: + ansi-align: 3.0.0 + camelcase: 6.2.0 + chalk: 4.1.0 + cli-boxes: 2.2.1 + string-width: 4.2.0 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /braces/3.0.2: + dependencies: + fill-range: 7.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + /cacheable-request/6.1.0: + dependencies: + clone-response: 1.0.2 + get-stream: 5.2.0 + http-cache-semantics: 4.1.0 + keyv: 3.1.0 + lowercase-keys: 2.0.0 + normalize-url: 4.5.0 + responselike: 1.0.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + /callsites/3.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + /camelcase/5.3.1: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + /camelcase/6.2.0: + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + /caseless/0.12.0: + dev: false + optional: true + resolution: + integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /chalk/3.0.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + /chalk/4.1.0: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + engines: + node: '>=10' + resolution: + integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + /chokidar/3.5.1: + dependencies: + anymatch: 3.1.1 + braces: 3.0.2 + glob-parent: 5.1.1 + is-binary-path: 2.1.0 + is-glob: 4.0.1 + normalize-path: 3.0.0 + readdirp: 3.5.0 + dev: true + engines: + node: '>= 8.10.0' + optionalDependencies: + fsevents: 2.3.2 + resolution: + integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + /chownr/1.1.4: + dev: false + optional: true + resolution: + integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + /ci-info/2.0.0: + dev: true + resolution: + integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + /cli-boxes/2.2.1: + engines: + node: '>=6' + resolution: + integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + /clone-response/1.0.2: + dependencies: + mimic-response: 1.0.1 + dev: true + resolution: + integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + /code-point-at/1.1.0: + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + dev: true + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-convert/2.0.1: + dependencies: + color-name: 1.1.4 + engines: + node: '>=7.0.0' + resolution: + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + /color-name/1.1.3: + dev: true + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /color-name/1.1.4: + resolution: + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + /combined-stream/1.0.8: + dependencies: + delayed-stream: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + /concat-map/0.0.1: + resolution: + integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /configstore/5.0.1: + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.6 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + /console-control-strings/1.1.0: + dev: false + optional: true + resolution: + integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + /core-util-is/1.0.2: + dev: false + optional: true + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /cross-spawn/7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + engines: + node: '>= 8' + resolution: + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + /crypto-random-string/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + /dashdash/1.14.1: + dependencies: + assert-plus: 1.0.0 + dev: false + engines: + node: '>=0.10' + optional: true + resolution: + integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + /debug/2.6.9: + dependencies: + ms: 2.0.0 + dev: true + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /debug/3.2.7: + dependencies: + ms: 2.1.3 + resolution: + integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + /debug/4.3.1: + dependencies: + ms: 2.1.2 + engines: + node: '>=6.0' + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + resolution: + integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + /decompress-response/3.3.0: + dependencies: + mimic-response: 1.0.1 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + /deep-extend/0.6.0: + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + /deep-is/0.1.3: + dev: true + resolution: + integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + /defer-to-connect/1.1.3: + dev: true + resolution: + integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + /delayed-stream/1.0.0: + dev: false + engines: + node: '>=0.4.0' + resolution: + integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + /delegates/1.0.0: + dev: false + optional: true + resolution: + integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + /detect-libc/1.0.3: + dev: false + engines: + node: '>=0.10' + hasBin: true + optional: true + resolution: + integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + /discord.js/12.5.1: + dependencies: + '@discordjs/collection': 0.1.6 + '@discordjs/form-data': 3.0.1 + abort-controller: 3.0.0 + node-fetch: 2.6.1 + prism-media: 1.2.6 + setimmediate: 1.0.5 + tweetnacl: 1.0.3 + ws: 7.4.3 + dev: false + engines: + node: '>=12.0.0' + resolution: + integrity: sha512-VwZkVaUAIOB9mKdca0I5MefPMTQJTNg0qdgi1huF3iwsFwJ0L5s/Y69AQe+iPmjuV6j9rtKoG0Ta0n9vgEIL6w== + /doctrine/3.0.0: + dependencies: + esutils: 2.0.3 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + /dot-prop/5.3.0: + dependencies: + is-obj: 2.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + /dotenv/8.2.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + /dottie/2.0.2: + dev: false + resolution: + integrity: sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg== + /duplexer3/0.1.4: + dev: true + resolution: + integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + /ecc-jsbn/0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + optional: true + resolution: + integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + /emoji-regex/7.0.3: + resolution: + integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + /emoji-regex/8.0.0: + resolution: + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + /end-of-stream/1.4.4: + dependencies: + once: 1.4.0 + dev: true + resolution: + integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + /enquirer/2.3.6: + dependencies: + ansi-colors: 4.1.1 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + /escape-goat/2.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + /escape-string-regexp/1.0.5: + dev: true + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /eslint-scope/5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + engines: + node: '>=8.0.0' + resolution: + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + /eslint-utils/2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + /eslint-visitor-keys/1.3.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + /eslint-visitor-keys/2.0.0: + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + /eslint/7.20.0: + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.3.0 + ajv: 6.12.6 + chalk: 4.1.0 + cross-spawn: 7.0.3 + debug: 4.3.1 + doctrine: 3.0.0 + enquirer: 2.3.6 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.0.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + file-entry-cache: 6.0.0 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.1 + globals: 12.4.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.1 + js-yaml: 3.14.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash: 4.17.20 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.1.0 + semver: 7.3.4 + strip-ansi: 6.0.0 + strip-json-comments: 3.1.1 + table: 6.0.7 + text-table: 0.2.0 + v8-compile-cache: 2.2.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + hasBin: true + resolution: + integrity: sha512-qGi0CTcOGP2OtCQBgWZlQjcTuP0XkIpYFj25XtRTQSHC+umNnp7UMshr2G8SLsRFYDdAPFeHOsiteadmMH02Yw== + /espree/7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.1_acorn@7.4.1 + eslint-visitor-keys: 1.3.0 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + /esprima/4.0.1: + dev: true + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + /esquery/1.4.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=0.10' + resolution: + integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + /esrecurse/4.3.0: + dependencies: + estraverse: 5.2.0 + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + /estraverse/4.3.0: + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + /estraverse/5.2.0: + dev: true + engines: + node: '>=4.0' + resolution: + integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + /esutils/2.0.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + /event-target-shim/5.0.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + /extend/3.0.2: + dev: false + optional: true + resolution: + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + /extsprintf/1.3.0: + dev: false + engines: + '0': node >=0.6.0 + optional: true + resolution: + integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + /fast-deep-equal/3.1.3: + resolution: + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + /fast-json-stable-stringify/2.1.0: + resolution: + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + /fast-levenshtein/2.0.6: + dev: true + resolution: + integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + /file-entry-cache/6.0.0: + dependencies: + flat-cache: 3.0.4 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA== + /fill-range/7.0.1: + dependencies: + to-regex-range: 5.0.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + /flat-cache/3.0.4: + dependencies: + flatted: 3.1.1 + rimraf: 3.0.2 + dev: true + engines: + node: ^10.12.0 || >=12.0.0 + resolution: + integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + /flatted/3.1.1: + dev: true + resolution: + integrity: sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== + /forever-agent/0.6.1: + dev: false + optional: true + resolution: + integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + /form-data/2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.28 + dev: false + engines: + node: '>= 0.12' + optional: true + resolution: + integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + /fs-minipass/1.2.7: + dependencies: + minipass: 2.9.0 + dev: false + optional: true + resolution: + integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + /fs.realpath/1.0.0: + resolution: + integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + /fsevents/2.3.2: + dev: true + engines: + node: ^8.16.0 || ^10.6.0 || >=11.0.0 + optional: true + os: + - darwin + resolution: + integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + /fstream/1.0.12: + dependencies: + graceful-fs: 4.2.6 + inherits: 2.0.4 + mkdirp: 0.5.5 + rimraf: 2.7.1 + dev: false + engines: + node: '>=0.6' + optional: true + resolution: + integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + /functional-red-black-tree/1.0.1: + dev: true + resolution: + integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + /gauge/2.7.4: + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.3 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.3 + dev: false + optional: true + resolution: + integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + /get-stream/4.1.0: + dependencies: + pump: 3.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + /get-stream/5.2.0: + dependencies: + pump: 3.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + /getpass/0.1.7: + dependencies: + assert-plus: 1.0.0 + dev: false + optional: true + resolution: + integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + /glob-parent/5.1.1: + dependencies: + is-glob: 4.0.1 + dev: true + engines: + node: '>= 6' + resolution: + integrity: sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + /glob/7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + resolution: + integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + /global-dirs/2.1.0: + dependencies: + ini: 1.3.7 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ== + /globals/12.4.0: + dependencies: + type-fest: 0.8.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + /got/9.6.0: + dependencies: + '@sindresorhus/is': 0.14.0 + '@szmarczak/http-timer': 1.1.2 + cacheable-request: 6.1.0 + decompress-response: 3.3.0 + duplexer3: 0.1.4 + get-stream: 4.1.0 + lowercase-keys: 1.0.1 + mimic-response: 1.0.1 + p-cancelable: 1.1.0 + to-readable-stream: 1.0.0 + url-parse-lax: 3.0.0 + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + /graceful-fs/4.2.6: + resolution: + integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + /har-schema/2.0.0: + dev: false + engines: + node: '>=4' + optional: true + resolution: + integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + /har-validator/5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + deprecated: this library is no longer supported + dev: false + engines: + node: '>=6' + optional: true + resolution: + integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + /has-flag/3.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /has-flag/4.0.0: + engines: + node: '>=8' + resolution: + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + /has-unicode/2.0.1: + dev: false + optional: true + resolution: + integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + /has-yarn/2.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + /http-cache-semantics/4.1.0: + dev: true + resolution: + integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + /http-signature/1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.1 + sshpk: 1.16.1 + dev: false + engines: + node: '>=0.8' + npm: '>=1.3.7' + optional: true + resolution: + integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /ignore-by-default/1.0.1: + dev: true + resolution: + integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + /ignore-walk/3.0.3: + dependencies: + minimatch: 3.0.4 + dev: false + optional: true + resolution: + integrity: sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + /ignore/4.0.6: + dev: true + engines: + node: '>= 4' + resolution: + integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + /import-fresh/3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + /import-lazy/2.1.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + /imurmurhash/0.1.4: + dev: true + engines: + node: '>=0.8.19' + resolution: + integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= + /inflection/1.12.0: + dev: false + engines: + '0': node >= 0.4.0 + resolution: + integrity: sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + resolution: + integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + /inherits/2.0.4: + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ini/1.3.7: + dev: true + resolution: + integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ== + /ini/1.3.8: + resolution: + integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + /is-binary-path/2.1.0: + dependencies: + binary-extensions: 2.2.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + /is-ci/2.0.0: + dependencies: + ci-info: 2.0.0 + dev: true + hasBin: true + resolution: + integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + /is-extglob/2.1.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + /is-fullwidth-code-point/1.0.0: + dependencies: + number-is-nan: 1.0.1 + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + /is-fullwidth-code-point/2.0.0: + engines: + node: '>=4' + resolution: + integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + /is-fullwidth-code-point/3.0.0: + engines: + node: '>=8' + resolution: + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + /is-glob/4.0.1: + dependencies: + is-extglob: 2.1.1 + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + /is-installed-globally/0.3.2: + dependencies: + global-dirs: 2.1.0 + is-path-inside: 3.0.2 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== + /is-npm/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== + /is-number/7.0.0: + dev: true + engines: + node: '>=0.12.0' + resolution: + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + /is-obj/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + /is-path-inside/3.0.2: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== + /is-typedarray/1.0.0: + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /is-yarn-global/0.3.0: + dev: true + resolution: + integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + /isarray/1.0.0: + dev: false + optional: true + resolution: + integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + /isexe/2.0.0: + resolution: + integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + /isstream/0.1.2: + dev: false + optional: true + resolution: + integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + /js-tokens/4.0.0: + dev: true + resolution: + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + /js-yaml/3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + hasBin: true + resolution: + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + /jsbn/0.1.1: + dev: false + optional: true + resolution: + integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + /json-buffer/3.0.0: + dev: true + resolution: + integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + /json-schema-traverse/0.4.1: + resolution: + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + /json-schema-traverse/1.0.0: + dev: true + resolution: + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + /json-schema/0.2.3: + dev: false + optional: true + resolution: + integrity: sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + /json-stable-stringify-without-jsonify/1.0.1: + dev: true + resolution: + integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + /json-stringify-safe/5.0.1: + dev: false + optional: true + resolution: + integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + /jsprim/1.4.1: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.2.3 + verror: 1.10.0 + dev: false + engines: + '0': node >=0.6.0 + optional: true + resolution: + integrity: sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + /keyv/3.1.0: + dependencies: + json-buffer: 3.0.0 + dev: true + resolution: + integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + /latest-version/5.1.0: + dependencies: + package-json: 6.5.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + /leeks.js/0.0.9: + dev: false + resolution: + integrity: sha512-e6UVJ1fj8f2clpHy+KpXVWVxjzB3XYFGyKRJHDlT8Gy/75BT+9bYUacpHSCoXp7RTtyMSr4eBjZrp0nHyyQVbg== + /leekslazylogger/2.0.7: + dependencies: + '@eartharoid/dtf': 1.0.8 + leeks.js: 0.0.9 + lodash.merge: 4.6.2 + dev: false + resolution: + integrity: sha512-HC0kNjPSOAKx4L9HwmKuvJp1OQQgS6U2IjXq6plKc845TcaAFRNw/2ILHze29z+fPn+44xUeI49FrLuVgSUL/A== + /levn/0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + /lodash.merge/4.6.2: + dev: false + resolution: + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + /lodash/4.17.20: + resolution: + integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + /lowercase-keys/1.0.1: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + /lowercase-keys/2.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + /lru-cache/6.0.0: + dependencies: + yallist: 4.0.0 + engines: + node: '>=10' + resolution: + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + /make-dir/3.1.0: + dependencies: + semver: 6.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + /mime-db/1.45.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + /mime-types/2.1.28: + dependencies: + mime-db: 1.45.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + /mimic-response/1.0.1: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + /minimatch/3.0.4: + dependencies: + brace-expansion: 1.1.11 + resolution: + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + /minimist/1.2.5: + resolution: + integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + /minipass/2.9.0: + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + optional: true + resolution: + integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + /minizlib/1.3.3: + dependencies: + minipass: 2.9.0 + dev: false + optional: true + resolution: + integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + /mkdirp/0.5.5: + dependencies: + minimist: 1.2.5 + dev: false + hasBin: true + optional: true + resolution: + integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + /moment-timezone/0.5.33: + dependencies: + moment: 2.29.1 + dev: false + resolution: + integrity: sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== + /moment/2.29.1: + dev: false + resolution: + integrity: sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + /ms/2.0.0: + dev: true + resolution: + integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /ms/2.1.2: + resolution: + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + /ms/2.1.3: + resolution: + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + /n-readlines/1.0.1: + dev: false + engines: + node: '>=6.x.x' + resolution: + integrity: sha512-z4SyAIVgMy7CkgsoNw7YVz40v0g4+WWvvqy8+ZdHrCtgevcEO758WQyrYcw3XPxcLxF+//RszTz/rO48nzD0wQ== + /natural-compare/1.4.0: + dev: true + resolution: + integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + /needle/2.6.0: + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.2.4 + dev: false + engines: + node: '>= 4.4.x' + hasBin: true + optional: true + resolution: + integrity: sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + /node-addon-api/3.1.0: + dev: false + optional: true + resolution: + integrity: sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== + /node-fetch/2.6.1: + dev: false + engines: + node: 4.x || >=6.0.0 + resolution: + integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + /node-gyp/3.8.0: + dependencies: + fstream: 1.0.12 + glob: 7.1.6 + graceful-fs: 4.2.6 + mkdirp: 0.5.5 + nopt: 3.0.6 + npmlog: 4.1.2 + osenv: 0.1.5 + request: 2.88.2 + rimraf: 2.7.1 + semver: 5.3.0 + tar: 2.2.2 + which: 1.3.1 + dev: false + engines: + node: '>= 0.8.0' + hasBin: true + optional: true + resolution: + integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + /node-pre-gyp/0.11.0: + dependencies: + detect-libc: 1.0.3 + mkdirp: 0.5.5 + needle: 2.6.0 + nopt: 4.0.3 + npm-packlist: 1.4.8 + npmlog: 4.1.2 + rc: 1.2.8 + rimraf: 2.7.1 + semver: 5.7.1 + tar: 4.4.13 + deprecated: 'Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future' + dev: false + hasBin: true + optional: true + resolution: + integrity: sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== + /nodemon/2.0.7: + dependencies: + chokidar: 3.5.1 + debug: 3.2.7 + ignore-by-default: 1.0.1 + minimatch: 3.0.4 + pstree.remy: 1.1.8 + semver: 5.7.1 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.3 + update-notifier: 4.1.3 + dev: true + engines: + node: '>=8.10.0' + hasBin: true + requiresBuild: true + resolution: + integrity: sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA== + /nopt/1.0.10: + dependencies: + abbrev: 1.1.1 + dev: true + hasBin: true + resolution: + integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + /nopt/3.0.6: + dependencies: + abbrev: 1.1.1 + dev: false + hasBin: true + optional: true + resolution: + integrity: sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + /nopt/4.0.3: + dependencies: + abbrev: 1.1.1 + osenv: 0.1.5 + dev: false + hasBin: true + optional: true + resolution: + integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== + /normalize-path/3.0.0: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + /normalize-url/4.5.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + /npm-bundled/1.1.1: + dependencies: + npm-normalize-package-bin: 1.0.1 + dev: false + optional: true + resolution: + integrity: sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + /npm-normalize-package-bin/1.0.1: + dev: false + optional: true + resolution: + integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + /npm-packlist/1.4.8: + dependencies: + ignore-walk: 3.0.3 + npm-bundled: 1.1.1 + npm-normalize-package-bin: 1.0.1 + dev: false + optional: true + resolution: + integrity: sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + /npmlog/4.1.2: + dependencies: + are-we-there-yet: 1.1.5 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + dev: false + optional: true + resolution: + integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + /number-is-nan/1.0.1: + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + /oauth-sign/0.9.0: + dev: false + optional: true + resolution: + integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + /object-assign/4.1.1: + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + resolution: + integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + /optionator/0.9.1: + dependencies: + deep-is: 0.1.3 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + /os-homedir/1.0.2: + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + /os-tmpdir/1.0.2: + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + /osenv/0.1.5: + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: false + optional: true + resolution: + integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + /p-cancelable/1.1.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + /package-json/6.5.0: + dependencies: + got: 9.6.0 + registry-auth-token: 4.2.1 + registry-url: 5.1.0 + semver: 6.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + /parent-module/1.0.1: + dependencies: + callsites: 3.1.0 + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + /path-is-absolute/1.0.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-key/3.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + /performance-now/2.1.0: + dev: false + optional: true + resolution: + integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + /picomatch/2.2.2: + dev: true + engines: + node: '>=8.6' + resolution: + integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + /prelude-ls/1.2.1: + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + /prepend-http/2.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + /prism-media/1.2.6: + dev: false + peerDependencies: + '@discordjs/opus': ^0.4.0 + ffmpeg-static: ^4.2.7 || ^3.0.0 || ^2.4.0 + node-opus: ^0.3.3 + opusscript: ^0.0.7 + peerDependenciesMeta: + '@discordjs/opus': + optional: true + ffmpeg-static: + optional: true + node-opus: + optional: true + opusscript: + optional: true + resolution: + integrity: sha512-I1Ys8HA+9aSKQ2jbkO3r6p9Z+tMpSssGhucgxXvc0sSpOi0kK550rDQnKtAS7Z5TzPQeLJdBmK2Br8x+5137lg== + /process-nextick-args/2.0.1: + dev: false + optional: true + resolution: + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + /progress/2.0.3: + dev: true + engines: + node: '>=0.4.0' + resolution: + integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + /psl/1.8.0: + dev: false + optional: true + resolution: + integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + /pstree.remy/1.1.8: + dev: true + resolution: + integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + /pump/3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + resolution: + integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + /punycode/2.1.1: + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /pupa/2.1.1: + dependencies: + escape-goat: 2.1.1 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + /qs/6.5.2: + dev: false + engines: + node: '>=0.6' + optional: true + resolution: + integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + /rc/1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.5 + strip-json-comments: 2.0.1 + hasBin: true + resolution: + integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + /readable-stream/2.3.7: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + optional: true + resolution: + integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + /readdirp/3.5.0: + dependencies: + picomatch: 2.2.2 + dev: true + engines: + node: '>=8.10.0' + resolution: + integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== + /regexpp/3.1.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + /registry-auth-token/4.2.1: + dependencies: + rc: 1.2.8 + dev: true + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + /registry-url/5.1.0: + dependencies: + rc: 1.2.8 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + /request/2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.11.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.28 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.2 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dev: false + engines: + node: '>= 6' + optional: true + resolution: + integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + /require-from-string/2.0.2: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + /resolve-from/4.0.0: + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + /responselike/1.0.2: + dependencies: + lowercase-keys: 1.0.1 + dev: true + resolution: + integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + /retry-as-promised/3.2.0: + dependencies: + any-promise: 1.3.0 + dev: false + resolution: + integrity: sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg== + /rimraf/2.7.1: + dependencies: + glob: 7.1.6 + dev: false + hasBin: true + optional: true + resolution: + integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + /rimraf/3.0.2: + dependencies: + glob: 7.1.6 + dev: true + hasBin: true + resolution: + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + /safe-buffer/5.1.2: + dev: false + optional: true + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.1: + dev: false + optional: true + resolution: + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + /safer-buffer/2.1.2: + dev: false + optional: true + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /sax/1.2.4: + dev: false + optional: true + resolution: + integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + /semver-diff/3.1.1: + dependencies: + semver: 6.3.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + /semver/5.3.0: + dev: false + hasBin: true + optional: true + resolution: + integrity: sha1-myzl094C0XxgEq0yaqa00M9U+U8= + /semver/5.7.1: + hasBin: true + resolution: + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + /semver/6.3.0: + dev: true + hasBin: true + resolution: + integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + /semver/7.3.4: + dependencies: + lru-cache: 6.0.0 + engines: + node: '>=10' + hasBin: true + resolution: + integrity: sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + /sequelize-pool/6.1.0: + dev: false + engines: + node: '>= 10.0.0' + resolution: + integrity: sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg== + /sequelize/6.5.0_sqlite3@5.0.1: + dependencies: + debug: 4.3.1 + dottie: 2.0.2 + inflection: 1.12.0 + lodash: 4.17.20 + moment: 2.29.1 + moment-timezone: 0.5.33 + retry-as-promised: 3.2.0 + semver: 7.3.4 + sequelize-pool: 6.1.0 + sqlite3: 5.0.1 + toposort-class: 1.0.1 + uuid: 8.3.2 + validator: 10.11.0 + wkx: 0.5.0 + dev: false + engines: + node: '>=10.0.0' + peerDependencies: + mariadb: '*' + mysql2: '*' + pg: '*' + pg-hstore: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + mariadb: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-hstore: + optional: true + sqlite3: + optional: true + tedious: + optional: true + resolution: + integrity: sha512-owBt8fnzVy8E1OvyCyfCdVk7OOLyPVrBCMEf+CvRReC5oCyo+UqeXCtwaex9L6LM9ifZ1i3TG3sFeM5MgLK0CQ== + /set-blocking/2.0.0: + dev: false + optional: true + resolution: + integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + /setimmediate/1.0.5: + dev: false + resolution: + integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + /shebang-command/2.0.0: + dependencies: + shebang-regex: 3.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + /shebang-regex/3.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + /signal-exit/3.0.3: + resolution: + integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + /slice-ansi/4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + engines: + node: '>=10' + resolution: + integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + /sprintf-js/1.0.3: + dev: true + resolution: + integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + /sqlite3/5.0.1: + dependencies: + node-addon-api: 3.1.0 + node-pre-gyp: 0.11.0 + dev: false + optional: true + optionalDependencies: + node-gyp: 3.8.0 + peerDependenciesMeta: + node-gyp: + optional: true + requiresBuild: true + resolution: + integrity: sha512-kh2lTIcYNfmVcvhVJihsYuPj9U0xzBbh6bmqILO2hkryWSC9RRhzYmkIDtJkJ+d8Kg4wZRJ0T1reyHUEspICfg== + /sshpk/1.16.1: + dependencies: + asn1: 0.2.4 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + engines: + node: '>=0.10.0' + hasBin: true + optional: true + resolution: + integrity: sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + /string-width/1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + /string-width/3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + engines: + node: '>=6' + resolution: + integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + /string-width/4.2.0: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.0 + engines: + node: '>=8' + resolution: + integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + /string_decoder/1.1.1: + dependencies: + safe-buffer: 5.1.2 + dev: false + optional: true + resolution: + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + /strip-ansi/3.0.1: + dependencies: + ansi-regex: 2.1.1 + dev: false + engines: + node: '>=0.10.0' + optional: true + resolution: + integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + /strip-ansi/5.2.0: + dependencies: + ansi-regex: 4.1.0 + engines: + node: '>=6' + resolution: + integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + /strip-ansi/6.0.0: + dependencies: + ansi-regex: 5.0.0 + engines: + node: '>=8' + resolution: + integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + /strip-json-comments/2.0.1: + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo= + /strip-json-comments/3.1.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/7.2.0: + dependencies: + has-flag: 4.0.0 + engines: + node: '>=8' + resolution: + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + /supports-hyperlinks/2.1.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + /table/6.0.7: + dependencies: + ajv: 7.1.0 + lodash: 4.17.20 + slice-ansi: 4.0.0 + string-width: 4.2.0 + dev: true + engines: + node: '>=10.0.0' + resolution: + integrity: sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + /tar/2.2.2: + dependencies: + block-stream: 0.0.9 + fstream: 1.0.12 + inherits: 2.0.4 + dev: false + optional: true + resolution: + integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== + /tar/4.4.13: + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.5 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + engines: + node: '>=4.5' + optional: true + resolution: + integrity: sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + /term-size/2.2.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg== + /terminal-link/2.1.1: + dependencies: + ansi-escapes: 4.3.1 + supports-hyperlinks: 2.1.0 + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + /text-table/0.2.0: + dev: true + resolution: + integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + /to-readable-stream/1.0.0: + dev: true + engines: + node: '>=6' + resolution: + integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + /to-regex-range/5.0.1: + dependencies: + is-number: 7.0.0 + dev: true + engines: + node: '>=8.0' + resolution: + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + /to-time-monthsfork/1.1.4: + dependencies: + bignumber.js: 2.4.0 + dev: false + engines: + node: '>=4.6' + resolution: + integrity: sha512-3bWuIwm9QeOAq/UClxFp86QMSJ4GVHmAT8X+pkM0mIMVrpJPLfSieY5qvSsfLJugLNWTVpYJ2ayKWXH3jcAdow== + /toposort-class/1.0.1: + dev: false + resolution: + integrity: sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg= + /touch/3.1.0: + dependencies: + nopt: 1.0.10 + dev: true + hasBin: true + resolution: + integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + /tough-cookie/2.5.0: + dependencies: + psl: 1.8.0 + punycode: 2.1.1 + dev: false + engines: + node: '>=0.8' + optional: true + resolution: + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + /tunnel-agent/0.6.0: + dependencies: + safe-buffer: 5.2.1 + dev: false + optional: true + resolution: + integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + /tweetnacl/0.14.5: + dev: false + optional: true + resolution: + integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + /tweetnacl/1.0.3: + dev: false + resolution: + integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + /type-check/0.4.0: + dependencies: + prelude-ls: 1.2.1 + dev: true + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + /type-fest/0.11.0: + dev: false + engines: + node: '>=8' + resolution: + integrity: sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + /type-fest/0.20.2: + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + /type-fest/0.8.1: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + /typedarray-to-buffer/3.1.5: + dependencies: + is-typedarray: 1.0.0 + dev: true + resolution: + integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + /undefsafe/2.0.3: + dependencies: + debug: 2.6.9 + dev: true + resolution: + integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== + /unique-string/2.0.0: + dependencies: + crypto-random-string: 2.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + /update-notifier/4.1.3: + dependencies: + boxen: 4.2.0 + chalk: 3.0.0 + configstore: 5.0.1 + has-yarn: 2.1.0 + import-lazy: 2.1.0 + is-ci: 2.0.0 + is-installed-globally: 0.3.2 + is-npm: 4.0.0 + is-yarn-global: 0.3.0 + latest-version: 5.1.0 + pupa: 2.1.1 + semver-diff: 3.1.1 + xdg-basedir: 4.0.0 + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A== + /uri-js/4.4.1: + dependencies: + punycode: 2.1.1 + resolution: + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + /url-parse-lax/3.0.0: + dependencies: + prepend-http: 2.0.0 + dev: true + engines: + node: '>=4' + resolution: + integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + /util-deprecate/1.0.2: + dev: false + optional: true + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /uuid/3.4.0: + dev: false + hasBin: true + optional: true + resolution: + integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + /uuid/8.3.2: + dev: false + hasBin: true + resolution: + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + /v8-compile-cache/2.2.0: + dev: true + resolution: + integrity: sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + /validator/10.11.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw== + /verror/1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: false + engines: + '0': node >=0.6.0 + optional: true + resolution: + integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + /which/1.3.1: + dependencies: + isexe: 2.0.0 + dev: false + hasBin: true + optional: true + resolution: + integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + /which/2.0.2: + dependencies: + isexe: 2.0.0 + dev: true + engines: + node: '>= 8' + hasBin: true + resolution: + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + /wide-align/1.1.3: + dependencies: + string-width: 1.0.2 + dev: false + optional: true + resolution: + integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + /widest-line/3.1.0: + dependencies: + string-width: 4.2.0 + engines: + node: '>=8' + resolution: + integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + /wkx/0.5.0: + dependencies: + '@types/node': 14.14.28 + dev: false + resolution: + integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg== + /word-wrap/1.2.3: + dev: true + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + /wrap-ansi/7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.0 + strip-ansi: 6.0.0 + dev: false + engines: + node: '>=10' + resolution: + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + /wrappy/1.0.2: + resolution: + integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + /write-file-atomic/3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.3 + typedarray-to-buffer: 3.1.5 + dev: true + resolution: + integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + /ws/7.4.3: + dev: false + engines: + node: '>=8.3.0' + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + resolution: + integrity: sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== + /xdg-basedir/4.0.0: + dev: true + engines: + node: '>=8' + resolution: + integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + /yallist/3.1.1: + dev: false + optional: true + resolution: + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + /yallist/4.0.0: + resolution: + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +specifiers: + '@eartharoid/dtf': ^1.0.8 + boxen: ^5.0.0 + discord.js: ^12.5.1 + dotenv: ^8.2.0 + eslint: ^7.19.0 + leekslazylogger: ^2.0.7 + n-readlines: ^1.0.1 + node-fetch: ^2.6.1 + nodemon: ^2.0.7 + sequelize: ^6.5.0 + sqlite3: ^5.0.0 + terminal-link: ^2.1.1 + to-time-monthsfork: ^1.1.3 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4121502 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +mkdocs-material +mkdocs-awesome-pages-plugin +mkdocs-git-revision-date-localized-plugin diff --git a/src/commands/add.js b/src/commands/add.js deleted file mode 100644 index 53aa84b..0000000 --- a/src/commands/add.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'add', - description: 'Add a member to a ticket channel', - usage: '<@member> [... #channel]', - aliases: ['none'], - example: 'add @member to #ticket-23', - args: true, - async execute(client, message, args, log, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - - const notTicket = new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to add a user to, or mention the channel.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()); - - let ticket; - - let channel = message.mentions.channels.first(); - - if (!channel) { - channel = message.channel; - ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if (!ticket) return message.channel.send(notTicket); - - } else { - ticket = await Ticket.findOne({ where: { channel: channel.id } }); - if (!ticket) { - notTicket - .setTitle('❌ **Channel is not a ticket**') - .setDescription(`${channel} is not a ticket channel.`); - return message.channel.send(notTicket); - } - } - - if (message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription(`You don't have permission to alter ${channel} as it does not belong to you and you are not staff.`) - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - let member = guild.member(message.mentions.users.first() || guild.members.cache.get(args[0])); - - if (!member) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Unknown member**') - .setDescription('Please mention a valid member.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - try { - channel.updateOverwrite(member.user, { - VIEW_CHANNEL: true, - SEND_MESSAGES: true, - ATTACH_FILES: true, - READ_MESSAGE_HISTORY: true - }); - - if (channel.id !== message.channel.id) { - channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(member.user.username, member.user.displayAvatarURL()) - .setTitle('**Member added**') - .setDescription(`${member} has been added by ${message.author}`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(member.user.username, member.user.displayAvatarURL()) - .setTitle('✅ **Member added**') - .setDescription(`${member} has been added to <#${ticket.channel}>`) - .setFooter(guild.name, guild.iconURL()) - ); - - log.info(`${message.author.tag} added a user to a ticket (#${message.channel.id})`); - } catch (error) { - log.error(error); - } - // command ends here - }, -}; diff --git a/src/commands/close.js b/src/commands/close.js deleted file mode 100644 index d42fe6a..0000000 --- a/src/commands/close.js +++ /dev/null @@ -1,238 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); -const fs = require('fs'); -const { join } = require('path'); -const archive = require('../modules/archive'); - -module.exports = { - name: 'close', - description: 'Close a ticket; either a specified (mentioned) channel, or the channel the command is used in.', - usage: '[ticket]', - aliases: ['none'], - example: 'close #ticket-17', - args: false, - async execute(client, message, _args, log, { config, Ticket }) { - const guild = client.guilds.cache.get(config.guild); - - const notTicket = new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to close, or mention the channel.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()); - - let ticket; - let channel = message.mentions.channels.first(); - // || client.channels.resolve(await Ticket.findOne({ where: { id: args[0] } }).channel) // channels.fetch() - - if (!channel) { - channel = message.channel; - - ticket = await Ticket.findOne({ - where: { - channel: channel.id - } - }); - if (!ticket) return message.channel.send(notTicket); - } else { - ticket = await Ticket.findOne({ - where: { - channel: channel.id - } - }); - if (!ticket) { - notTicket - .setTitle('❌ **Channel is not a ticket**') - .setDescription(`${channel} is not a ticket channel.`); - return message.channel.send(notTicket); - } - - } - - let paths = { - text: join(__dirname, `../../user/transcripts/text/${ticket.get('channel')}.txt`), - log: join(__dirname, `../../user/transcripts/raw/${ticket.get('channel')}.log`), - json: join(__dirname, `../../user/transcripts/raw/entities/${ticket.get('channel')}.json`) - }; - - if (message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription(`You don't have permission to close ${channel} as it does not belong to you and you are not staff.`) - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - - - if (config.commands.close.confirmation) { - let success; - let pre = fs.existsSync(paths.text) || fs.existsSync(paths.log) - ? `You will be able to view an archived version later with \`${config.prefix}transcript ${ticket.id}\`` - : ''; - - let confirm = await message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❔ Are you sure?') - .setDescription(`${pre}\n**React with ✅ to confirm.**`) - .setFooter(guild.name + ' | Expires in 15 seconds', guild.iconURL()) - ); - - await confirm.react('✅'); - - const collector = confirm.createReactionCollector( - (r, u) => r.emoji.name === '✅' && u.id === message.author.id, { - time: 15000 - }); - - collector.on('collect', async () => { - if (channel.id !== message.channel.id) { - channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('**Ticket closed**') - .setDescription(`Ticket closed by ${message.author}`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - confirm.reactions.removeAll(); - confirm.edit( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`✅ **Ticket ${ticket.id} closed**`) - .setDescription('The channel will be automatically deleted in a few seconds, once the contents have been archived.') - .setFooter(guild.name, guild.iconURL()) - ); - - - if (channel.id !== message.channel.id) - message.delete({ - timeout: 5000 - }).then(() => confirm.delete()); - - success = true; - close(); - }); - - - collector.on('end', () => { - if (!success) { - confirm.reactions.removeAll(); - confirm.edit( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Expired**') - .setDescription('You took too long to react; confirmation failed.') - .setFooter(guild.name, guild.iconURL())); - - message.delete({ - timeout: 10000 - }).then(() => confirm.delete()); - } - }); - } else { - close(); - } - - - async function close () { - let users = []; - - if (config.transcripts.text.enabled || config.transcripts.web.enabled) { - let u = await client.users.fetch(ticket.creator); - if (u) { - let dm; - try { - dm = u.dmChannel || await u.createDM(); - } catch (e) { - log.warn(`Could not create DM channel with ${u.tag}`); - } - - let res = {}; - const embed = new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`Ticket ${ticket.id}`) - .setFooter(guild.name, guild.iconURL()); - - if (fs.existsSync(paths.text)) { - embed.addField('Text transcript', 'See attachment'); - res.files = [{ - attachment: paths.text, - name: `ticket-${ticket.id}-${ticket.get('channel')}.txt` - }]; - } - - if (fs.existsSync(paths.log) && fs.existsSync(paths.json)) { - let data = JSON.parse(fs.readFileSync(paths.json)); - for (u in data.entities.users) users.push(u); - embed.addField('Web archive', await archive.export(Ticket, channel)); // this will also delete these files - } - - if (embed.fields.length < 1) { - embed.setDescription(`No text transcripts or archive data exists for ticket ${ticket.id}`); - } - - res.embed = embed; - - try { - if (config.commands.close.send_transcripts) dm.send(res); - if (config.transcripts.channel.length > 1) client.channels.cache.get(config.transcripts.channel).send(res); - } catch (e) { - message.channel.send('❌ Couldn\'t send DM or transcript log message'); - } - } - } - - // update database - ticket.update({ - open: false - }, { - where: { - channel: channel.id - } - }); - - // delete channel - channel.delete({ - timeout: 5000 - }); - - log.info(`${message.author.tag} closed a ticket (#ticket-${ticket.id})`); - - if (config.logs.discord.enabled) { - let embed = new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`Ticket ${ticket.id} closed`) - .addField('Creator', `<@${ticket.creator}>`, true) - .addField('Closed by', message.author, true) - .setFooter(guild.name, guild.iconURL()) - .setTimestamp(); - - if (users.length > 1) - embed.addField('Members', users.map(u => `<@${u}>`).join('\n')); - - client.channels.cache.get(config.logs.discord.channel).send(embed); - } - } - } -}; diff --git a/src/commands/closeall.js b/src/commands/closeall.js deleted file mode 100644 index 4091902..0000000 --- a/src/commands/closeall.js +++ /dev/null @@ -1,258 +0,0 @@ -/** - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); -const fs = require('fs'); -const { join } = require('path'); -const config = require(join(__dirname, '../../user/', require('../').config)); -const archive = require('../modules/archive'); -const { plural } = require('../modules/utils'); -const { Op } = require('sequelize'); -const toTime = require('to-time-monthsfork'); - -// A slight modification to the 'close' command to allow multiple tickets to be closed at once - -module.exports = { - name: 'closeall', - description: 'Closes all currently open tickets older than a specified time length', - usage: '[time]', - aliases: ['ca'], - example: 'closeall 1mo 1w', - args: false, - disabled: !config.commands.closeall.enabled, - async execute(client, message, args, log, { - config, - Ticket - }) { - const guild = client.guilds.cache.get(config.guild); - - if (!message.member.roles.cache.has(config.staff_role)) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription('You do not have permission to use this command as you are not a staff member.') - .addField('Usage', `\`${config.prefix}${this.name}${' ' + this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - - let tickets; - - if (args.length > 0) { - let time, maxDate; - let timestamp = args.join(' '); - - try { - time = toTime(timestamp).milliseconds(); - maxDate = new Date(Date.now() - time); - } catch (error) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Invalid Timestamp**') - .setDescription(`The timestamp that you specified, \`${timestamp}\`, was invalid.`) - .addField('Usage', `\`${config.prefix}${this.name}${' ' + this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - tickets = await Ticket.findAndCountAll({ - where: { - open: true, - updatedAt: { - [Op.lte]: maxDate, - } - }, - }); - } else { - tickets = await Ticket.findAndCountAll({ - where: { - open: true, - }, - }); - } - - if (tickets.count === 0) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.display) - .setTitle('❌ **No open tickets**') - .setDescription('There are no open tickets to close.') - .setFooter(guild.name, guild.iconURL()) - ); - - log.info(`Found ${tickets.count} open tickets`); - - if (config.commands.close.confirmation) { - let success; - let pre = config.transcripts.text.enabled || config.transcripts.web.enabled - ? `You will be able to view an archived version of each ticket later with \`${config.prefix}transcript \`` - : ''; - - let confirm = await message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`❔ Are you sure you want to close **${tickets.count}** tickets?`) - .setDescription(`${pre}\n**React with ✅ to confirm.**`) - .setFooter(guild.name + ' | Expires in 15 seconds', guild.iconURL()) - ); - - await confirm.react('✅'); - - const collector = confirm.createReactionCollector( - (reaction, user) => reaction.emoji.name === '✅' && user.id === message.author.id, { - time: 15000, - }); - - collector.on('collect', async () => { - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`**\`${tickets.count}\` tickets closed**`) - .setDescription(`**\`${tickets.count}\`** tickets closed by ${message.author}`) - .setFooter(guild.name, guild.iconURL()) - ); - - confirm.reactions.removeAll(); - confirm.edit( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`✅ ** \`${tickets.count}\` tickets closed**`) - .setDescription('The channels will be automatically deleted in a few seconds, once the contents have been archived.') - .setFooter(guild.name, guild.iconURL()) - ); - - message.delete({ - timeout: 5000, - }).then(() => confirm.delete()); - - success = true; - closeAll(); - }); - - collector.on('end', () => { - if (!success) { - confirm.reactions.removeAll(); - confirm.edit( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Expired**') - .setDescription('You took too long to react; confirmation failed.') - .setFooter(guild.name, guild.iconURL())); - - message.delete({ - timeout: 10000 - }).then(() => confirm.delete()); - } - }); - } else { - closeAll(); - } - - - async function closeAll() { - tickets.rows.forEach(async ticket => { - let users = []; - - if (config.transcripts.text.enabled || config.transcripts.web.enabled) { - let { - channel, - id, - creator - } = ticket; - - let user = await client.users.fetch(creator); - let paths = { - text: join(__dirname, `../../user/transcripts/text/${channel}.txt`), - log: join(__dirname, `../../user/transcripts/raw/${channel}.log`), - json: join(__dirname, `../../user/transcripts/raw/entities/${channel}.json`) - }; - - if (user) { - let dm; - try { - dm = user.dmChannel || await user.createDM(); - } catch (e) { - log.warn(`Could not create DM channel with ${user.tag}`); - } - - let res = {}; - const embed = new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username) - .setTitle(`Ticket ${id}`) - .setFooter(guild.name, guild.iconURL()); - - if (fs.existsSync(paths.text)) { - embed.addField('Text Transcript', 'See attachment'); - res.files = [{ - attachment: paths.text, - name: `ticket-${id}-${channel}.txt` - }]; - } - - if (fs.existsSync(paths.log) && fs.existsSync(paths.json)) { - let data = JSON.parse(fs.readFileSync(paths.json)); - data.entities.users.forEach(u => users.push(u)); - embed.addField('Web archive', await archive.export(Ticket, channel)); - } - - res.embed = embed; - - try { - if (config.commands.close.send_transcripts) dm.send(res); - if (config.transcripts.channel.length > 1) client.channels.cache.get(config.transcripts.channel).send(res); - } catch (e) { - message.channel.send('❌ Couldn\'t send DM or transcript log message'); - } - } - - await Ticket.update({ - open: false, - }, { - where: { - id, - } - }); - - log.info(log.format(`${message.author.tag} closed ticket &7${id}&f`)); - - client.channels.fetch(channel) - .then(c => c.delete() - .then(o => log.info(`Deleted channel with name: '#${o.name}' <${o.id}>`)) - .catch(e => log.error(e))) - .catch(e => log.error(e)); - - if (config.logs.discord.enabled) { - let embed = new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`${tickets.count} ${plural('ticket', tickets.count)} closed (${config.prefix}closeall)`) - .addField('Closed by', message.author, true) - .setFooter(guild.name, guild.iconURL()) - .setTimestamp(); - - if (users.length > 1) - embed.addField('Members', users.map(u => `<@${u}>`).join('\n')); - - client.channels.cache.get(config.logs.discord.channel).send(embed); - } - } - }); - } - - }, -}; diff --git a/src/commands/delete.js b/src/commands/delete.js deleted file mode 100644 index 681d50c..0000000 --- a/src/commands/delete.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { - MessageEmbed -} = require('discord.js'); -const fs = require('fs'); -const { join } = require('path'); - -module.exports = { - name: 'delete', - description: 'Delete a ticket. Similar to closing a ticket, but does not save transcript or archives.', - usage: '[ticket]', - aliases: ['del'], - example: 'delete #ticket-17', - args: false, - async execute(client, message, _args, log, { - config, - Ticket - }) { - const guild = client.guilds.cache.get(config.guild); - - const notTicket = new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to delete, or mention the channel.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()); - - let ticket; - let channel = message.mentions.channels.first(); - // || client.channels.resolve(await Ticket.findOne({ where: { id: args[0] } }).channel) // channels.fetch() - - if (!channel) { - channel = message.channel; - - ticket = await Ticket.findOne({ - where: { - channel: channel.id - } - }); - if (!ticket) return channel.send(notTicket); - - } else { - ticket = await Ticket.findOne({ - where: { - channel: channel.id - } - }); - if (!ticket) { - notTicket - .setTitle('❌ **Channel is not a ticket**') - .setDescription(`${channel} is not a ticket channel.`); - return message.channel.send(notTicket); - } - - } - if (message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) - return channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription(`You don't have permission to delete ${channel} as it does not belong to you and you are not staff.`) - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - - - if (config.commands.delete.confirmation) { - let success; - let confirm = await message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❔ Are you sure?') - .setDescription( - `:warning: This action is **irreversible**, the ticket will be completely removed from the database. - You will **not** be able to view a transcript/archive of the channel later. - Use the \`close\` command instead if you don't want this behaviour.\n**React with ✅ to confirm.**`) - .setFooter(guild.name + ' | Expires in 15 seconds', guild.iconURL()) - ); - - await confirm.react('✅'); - - const collector = confirm.createReactionCollector( - (r, u) => r.emoji.name === '✅' && u.id === message.author.id, { - time: 15000 - }); - - collector.on('collect', async () => { - if (channel.id !== message.channel.id) - channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('**Ticket deleted**') - .setDescription(`Ticket deleted by ${message.author}`) - .setFooter(guild.name, guild.iconURL()) - ); - - confirm.reactions.removeAll(); - confirm.edit( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`✅ **Ticket ${ticket.id} deleted**`) - .setDescription('The channel will be automatically deleted in a few seconds.') - .setFooter(guild.name, guild.iconURL()) - ); - - if (channel.id !== message.channel.id) - message.delete({ - timeout: 5000 - }).then(() => confirm.delete()); - - success = true; - del(); - }); - - collector.on('end', () => { - if (!success) { - confirm.reactions.removeAll(); - confirm.edit( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Expired**') - .setDescription('You took too long to react; confirmation failed.') - .setFooter(guild.name, guild.iconURL())); - - message.delete({ - timeout: 10000 - }).then(() => confirm.delete()); - } - }); - } else { - del(); - } - - - async function del () { - let txt = join(__dirname, `../../user/transcripts/text/${ticket.get('channel')}.txt`), - raw = join(__dirname, `../../user/transcripts/raw/${ticket.get('channel')}.log`), - json = join(__dirname, `../../user/transcripts/raw/entities/${ticket.get('channel')}.json`); - - if (fs.existsSync(txt)) fs.unlinkSync(txt); - if (fs.existsSync(raw)) fs.unlinkSync(raw); - if (fs.existsSync(json)) fs.unlinkSync(json); - - // update database - ticket.destroy(); // remove ticket from database - - // channel - channel.delete({ - timeout: 5000 - }); - - - log.info(`${message.author.tag} deleted a ticket (#ticket-${ticket.id})`); - - if (config.logs.discord.enabled) { - client.channels.cache.get(config.logs.discord.channel).send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('Ticket deleted') - .addField('Creator', `<@${ticket.creator}>`, true) - .addField('Deleted by', message.author, true) - .setFooter(guild.name, guild.iconURL()) - .setTimestamp() - ); - } - } - - } -}; \ No newline at end of file diff --git a/src/commands/help.js b/src/commands/help.js deleted file mode 100644 index 2853fd4..0000000 --- a/src/commands/help.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'help', - description: 'Display help menu', - usage: '[command]', - aliases: ['command', 'commands'], - example: 'help new', - args: false, - execute(client, message, args, log, {config}) { - const guild = client.guilds.cache.get(config.guild); - - const commands = Array.from(client.commands.values()); - - if (!args.length) { - let cmds = []; - - for (let command of commands) { - if (command.hide || command.disabled) continue; - if (command.permission && !message.member.hasPermission(command.permission)) continue; - - let desc = command.description; - - if (desc.length > 50) desc = desc.substring(0, 50) + '...'; - cmds.push(`**${config.prefix}${command.name}** **·** ${desc}`); - } - - message.channel.send( - new MessageEmbed() - .setTitle('Commands') - .setColor(config.colour) - .setDescription( - `\nThe commands you have access to are listed below. Type \`${config.prefix}help [command]\` for more information about a specific command. - \n${cmds.join('\n\n')} - \nPlease contact a member of staff if you require assistance.` - ) - .setFooter(guild.name, guild.iconURL()) - ).catch((error) => { - log.warn('Could not send help menu'); - log.error(error); - }); - - } else { - const name = args[0].toLowerCase(); - const command = client.commands.get(name) || client.commands.find(c => c.aliases && c.aliases.includes(name)); - - if (!command) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setDescription(`❌ **Invalid command name** (\`${config.prefix}help\`)`) - ); - - - const cmd = new MessageEmbed() - .setColor(config.colour) - .setTitle(command.name); - - - if (command.long) cmd.setDescription(command.long); - else cmd.setDescription(command.description); - - if (command.aliases) cmd.addField('Aliases', `\`${command.aliases.join(', ')}\``, true); - - if (command.usage) cmd.addField('Usage', `\`${config.prefix}${command.name} ${command.usage}\``, false); - - if (command.usage) cmd.addField('Example', `\`${config.prefix}${command.example}\``, false); - - - if (command.permission && !message.member.hasPermission(command.permission)) { - cmd.addField('Required Permission', `\`${command.permission}\` :exclamation: You don't have permission to use this command`, true); - } else cmd.addField('Required Permission', `\`${command.permission || 'none'}\``, true); - - message.channel.send(cmd); - } - - // command ends here - }, -}; \ No newline at end of file diff --git a/src/commands/new.js b/src/commands/new.js deleted file mode 100644 index 801f8b1..0000000 --- a/src/commands/new.js +++ /dev/null @@ -1,205 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); -const fs = require('fs'); -const { join } = require('path'); -const config = require(join(__dirname, '../../user/', require('../').config)); - -module.exports = { - name: 'new', - description: 'Create a new support ticket', - usage: '[brief description]', - aliases: ['ticket', 'open'], - example: 'new my server won\'t start', - args: false, - disabled: !config.commands.new.enabled, - async execute(client, message, args, log, {config, Ticket}) { - - if (!config.commands.new.enabled) return; // stop if the command is disabled - - - const guild = client.guilds.cache.get(config.guild); - - const supportRole = guild.roles.cache.get(config.staff_role); - - if (!supportRole) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setTitle('❌ **Error**') - .setDescription(`${config.name} has not been set up correctly. Could not find a 'support team' role with the id \`${config.staff_role}\``) - .setFooter(guild.name, guild.iconURL()) - ); - - - let tickets = await Ticket.findAndCountAll({ - where: { - creator: message.author.id, - open: true - }, - limit: config.tickets.max - }); - - if (tickets.count >= config.tickets.max) { - let ticketList = []; - for (let t in tickets.rows) { - let desc = tickets.rows[t].topic.substring(0, 30); - ticketList - .push(`<#${tickets.rows[t].channel}>: \`${desc}${desc.length > 30 ? '...' : ''}\``); - } - - let m = await message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`❌ **You already have ${tickets.count} or more open tickets**`) - .setDescription(`Use \`${config.prefix}close\` to close unneeded tickets.\n\n${ticketList.join(',\n')}`) - .setFooter(guild.name + ' | This message will be deleted in 15 seconds', guild.iconURL()) - ); - - return setTimeout(async () => { - await message.delete(); - await m.delete(); - }, 15000); - } - - - let topic = args.join(' '); - if (topic.length > 256) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Description too long**') - .setDescription('Please limit your ticket topic to less than 256 characters. A short sentence will do.') - .setFooter(guild.name, guild.iconURL()) - ); - } - else if (topic.length < 1) { - topic = config.tickets.default_topic.command; - } - - let ticket = await Ticket.create({ - channel: '', - creator: message.author.id, - open: true, - archived: false, - topic: topic - }); - - let name = 'ticket-' + ticket.get('id'); - - guild.channels.create(name, { - type: 'text', - topic: `${message.author} | ${topic}`, - parent: config.tickets.category, - permissionOverwrites: [{ - id: guild.roles.everyone, - deny: ['VIEW_CHANNEL', 'SEND_MESSAGES'] - }, - { - id: client.user, - allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - }, - { - id: message.member, - allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - }, - { - id: supportRole, - allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - } - ], - reason: 'User requested a new support ticket channel' - }).then(async c => { - - Ticket.update({ - channel: c.id - }, { - where: { - id: ticket.id - } - }); - - let m = await message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('✅ **Ticket created**') - .setDescription(`Your ticket has been created: ${c}`) - .setFooter(client.user.username + ' | This message will be deleted in 15 seconds', client.user.displayAvatarURL()) - ); - - setTimeout(async () => { - await message.delete(); - await m.delete(); - }, 15000); - - // require('../modules/archive').create(client, c); // create files - - let ping; - switch (config.tickets.ping) { - case 'staff': - ping = `<@&${config.staff_role}>,\n`; - break; - case false: - ping = ''; - break; - default: - ping = `@${config.tickets.ping},\n`; - } - - await c.send(ping + `${message.author} has created a new ticket`); - - if (config.tickets.send_img) { - const images = fs.readdirSync(join(__dirname, '../../user/images')); - await c.send({ - files: [ - join(__dirname, '../../user/images', images[Math.floor(Math.random() * images.length)]) - ] - }); - } - - let text = config.tickets.text - .replace(/{{ ?name ?}}/gmi, message.author.username) - .replace(/{{ ?(tag|mention) ?}}/gmi, message.author); - - - let w = await c.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setDescription(text) - .addField('Topic', `\`${topic}\``) - .setFooter(guild.name, guild.iconURL()) - ); - - if (config.tickets.pin) await w.pin(); - // await w.pin().then(m => m.delete()); // oopsie, this deletes the pinned message - - if (config.logs.discord.enabled) - client.channels.cache.get(config.logs.discord.channel).send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('New ticket') - .setDescription(`\`${topic}\``) - .addField('Creator', message.author, true) - .addField('Channel', c, true) - .setFooter(guild.name, guild.iconURL()) - .setTimestamp() - ); - - log.info(`${message.author.tag} created a new ticket (#${name})`); - - - }).catch(log.error); - - }, -}; diff --git a/src/commands/panel.js b/src/commands/panel.js deleted file mode 100644 index f31a07a..0000000 --- a/src/commands/panel.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'panel', - description: 'Create or a panel widget in the channel the command is used in. Note that there can only be 1 panel.', - usage: '', - aliases: ['widget'], - args: false, - permission: 'MANAGE_GUILD', - async execute(client, message, _args, log, {config, Setting}) { - const guild = client.guilds.cache.get(config.guild); - - let msgID = await Setting.findOne({ where: { key: 'panel_msg_id' } }); - let chanID = await Setting.findOne({ where: { key: 'panel_chan_id' } }); - let panel; - - if (!chanID) { - chanID = await Setting.create({ - key: 'panel_chan_id', - value: message.channel.id, - }); - } - - if (!msgID) { - msgID = await Setting.create({ - key: 'panel_msg_id', - value: '', - }); - } else { - try { - panel = await client.channels.cache.get(chanID.get('value')).messages.fetch(msgID.get('value')); // get old panel message - if (panel) { - panel.delete({ reason: 'Creating new panel/widget' }).then(() => log.info('Deleted old panel')).catch(e => log.warn(e)); // delete old panel - } - } catch (e) { - log.warn('Couldn\'t delete old panel'); - } - } - - message.delete(); - - panel = await message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setTitle(config.panel.title) - .setDescription(config.panel.description) - .setFooter(guild.name, guild.iconURL()) - ); // send new panel - - let emoji = panel.guild.emojis.cache.get(config.panel.reaction) || config.panel.reaction; - panel.react(emoji); // add reaction - Setting.update({ value: message.channel.id }, { where: { key: 'panel_chan_id' }}); // update database - Setting.update({ value: panel.id }, { where: { key: 'panel_msg_id' }}); // update database - - log.info(`${message.author.tag} created a panel widget`); - } -}; diff --git a/src/commands/remove.js b/src/commands/remove.js deleted file mode 100644 index baae520..0000000 --- a/src/commands/remove.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'remove', - description: 'Remove a member from ticket channel', - usage: '<@member> [... #channel]', - aliases: ['none'], - example: 'remove @member from #ticket-23', - args: true, - async execute(client, message, args, log, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - - const notTicket = new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to remove a user from, or mention the channel.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()); - - let ticket; - - let channel = message.mentions.channels.first(); - - if (!channel) { - - channel = message.channel; - ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if (!ticket) - return message.channel.send(notTicket); - - } else { - - ticket = await Ticket.findOne({ where: { channel: channel.id } }); - if (!ticket) { - notTicket - .setTitle('❌ **Channel is not a ticket**') - .setDescription(`${channel} is not a ticket channel.`); - return message.channel.send(notTicket); - } - } - - if (message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription(`You don't have permission to alter ${channel} as it does not belong to you and you are not staff.`) - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - let member = guild.member(message.mentions.users.first() || guild.members.cache.get(args[0])); - - if (!member || member.id === message.author.id || member.id === guild.me.id) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Unknown member**') - .setDescription('Please mention a valid member.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - - try { - channel.updateOverwrite(member.user, { - VIEW_CHANNEL: false, - SEND_MESSAGES: false, - ATTACH_FILES: false, - READ_MESSAGE_HISTORY: false - }); - - if (channel.id !== message.channel.id) { - channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(member.user.username, member.user.displayAvatarURL()) - .setTitle('**Member removed**') - .setDescription(`${member} has been removed by ${message.author}`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(member.user.username, member.user.displayAvatarURL()) - .setTitle('✅ **Member removed**') - .setDescription(`${member} has been removed from <#${ticket.channel}>`) - .setFooter(guild.name, guild.iconURL()) - ); - - log.info(`${message.author.tag} removed a user from a ticket (#${message.channel.id})`); - } catch (error) { - log.error(error); - } - }, -}; diff --git a/src/commands/rename.js b/src/commands/rename.js deleted file mode 100644 index 816305e..0000000 --- a/src/commands/rename.js +++ /dev/null @@ -1,63 +0,0 @@ -/** - * - * @name DiscordTickets - * @author iFusion for eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'rename', - description: 'Rename a ticket channel', - usage: '', - aliases: ['none'], - example: 'rename important-ticket', - args: true, - async execute(client, message, args, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - - let ticket = await Ticket.findOne({ - where: { - channel: message.channel.id - } - }); - - if (!ticket) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to rename.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - if (!message.member.roles.cache.has(config.staff_role)) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription('You don\'t have permission to rename this channel as you are not staff.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - - message.channel.setName(args.join('-')); // new channel name - - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('✅ **Ticket updated**') - .setDescription('The name has been changed.') - .setFooter(client.user.username, client.user.displayAvatarURL()) - ); - } -}; diff --git a/src/commands/stats.js b/src/commands/stats.js deleted file mode 100644 index c8d7520..0000000 --- a/src/commands/stats.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'stats', - description: 'View ticket stats.', - usage: '', - aliases: ['data', 'statistics'], - - args: false, - async execute(client, message, _args, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - - let open = await Ticket.count({ where: { open: true } }); - let closed = await Ticket.count({ where: { open: false } }); - - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setTitle(':bar_chart: Statistics') - .addField('Open tickets', open, true) - .addField('Closed tickets', closed, true) - .addField('Total tickets', open + closed, true) - .setFooter(guild.name, guild.iconURL()) - ); - } -}; \ No newline at end of file diff --git a/src/commands/tickets.js b/src/commands/tickets.js deleted file mode 100644 index 778b52b..0000000 --- a/src/commands/tickets.js +++ /dev/null @@ -1,116 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); -const fs = require('fs'); -const { join } = require('path'); - -module.exports = { - name: 'tickets', - description: 'List your recent tickets to access transcripts / archives.', - usage: '[@member]', - aliases: ['list'], - args: false, - async execute(client, message, args, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - - const supportRole = guild.roles.cache.get(config.staff_role); - if (!supportRole) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setTitle('❌ **Error**') - .setDescription(`${config.name} has not been set up correctly. Could not find a 'support team' role with the id \`${config.staff_role}\``) - .setFooter(guild.name, guild.iconURL()) - ); - } - - let context = 'self'; - let user = message.mentions.users.first() || guild.members.cache.get(args[0]); - - if (user) { - if (!message.member.roles.cache.has(config.staff_role)) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription('You don\'t have permission to list others\' tickets as you are not staff.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - context = 'staff'; - } else user = message.author; - - let openTickets = await Ticket.findAndCountAll({ - where: { - creator: user.id, - open: true - } - }); - - let closedTickets = await Ticket.findAndCountAll({ - where: { - creator: user.id, - open: false - } - }); - - closedTickets.rows = closedTickets.rows.slice(-10); // get most recent 10 - - let embed = new MessageEmbed() - .setColor(config.colour) - .setAuthor(user.username, user.displayAvatarURL()) - .setTitle(`${context === 'self' ? 'Your' : user.username + '\'s'} tickets`) - .setFooter(guild.name + ' | This message will be deleted in 60 seconds', guild.iconURL()); - - /* if (config.transcripts.web.enabled) { - embed.setDescription(`You can access all of your ticket archives on the [web portal](${config.transcripts.web.server}/${user.id}).`); - } */ - - let open = [], - closed = []; - - for (let t in openTickets.rows) { - let desc = openTickets.rows[t].topic.substring(0, 30); - open.push(`> <#${openTickets.rows[t].channel}>: \`${desc}${desc.length > 20 ? '...' : ''}\``); - } - - for (let t in closedTickets.rows) { - let desc = closedTickets.rows[t].topic.substring(0, 30); - let transcript = ''; - let c = closedTickets.rows[t].channel; - if (config.transcripts.web.enabled || fs.existsSync(join(__dirname, `../../user/transcripts/text/${c}.txt`))) { - transcript = `\n> Type \`${config.prefix}transcript ${closedTickets.rows[t].id}\` to view.`; - } - - closed.push(`> **#${closedTickets.rows[t].id}**: \`${desc}${desc.length > 20 ? '...' : ''}\`${transcript}`); - - } - - let pre = context === 'self' ? 'You have' : user.username + ' has'; - embed.addField('Open tickets', openTickets.count === 0 ? `${pre} no open tickets.` : open.join('\n\n'), false); - embed.addField('Closed tickets', closedTickets.count === 0 ? `${pre} no old tickets` : closed.join('\n\n'), false); - - message.delete({timeout: 15000}); - - let channel; - try { - channel = message.author.dmChannel || await message.author.createDM(); - message.channel.send('Sent to DM').then(msg => msg.delete({timeout: 15000})); - } catch (e) { - channel = message.channel; - } - - let m = await channel.send(embed); - m.delete({timeout: 60000}); - }, -}; \ No newline at end of file diff --git a/src/commands/topic.js b/src/commands/topic.js deleted file mode 100644 index 969eafc..0000000 --- a/src/commands/topic.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'topic', - description: 'Edit a ticket topic', - usage: '', - aliases: ['edit'], - example: 'topic need help error', - args: true, - async execute(client, message, args, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - - let ticket = await Ticket.findOne({ - where: { - channel: message.channel.id - } - }); - - if (!ticket) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to close, or mention the channel.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - let topic = args.join(' '); - if (topic.length > 256) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Description too long**') - .setDescription('Please limit your ticket topic to less than 256 characters. A short sentence will do.') - .setFooter(guild.name, guild.iconURL()) - ); - } - - message.channel.setTopic(`<@${ticket.creator}> | ` + topic); - - Ticket.update({ - topic: topic - }, { - where: { - channel: message.channel.id - } - }); - - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('✅ **Ticket updated**') - .setDescription('The topic has been changed.') - .setFooter(client.user.username, client.user.displayAvatarURL()) - ); - } -}; \ No newline at end of file diff --git a/src/commands/transcript.js b/src/commands/transcript.js deleted file mode 100644 index 5703042..0000000 --- a/src/commands/transcript.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const fs = require('fs'); -const { join } = require('path'); - -const { - MessageEmbed -} = require('discord.js'); - -module.exports = { - name: 'transcript', - description: 'Download a transcript', - usage: '', - aliases: ['archive', 'download'], - example: 'transcript 57', - args: true, - async execute(client, message, args, {config, Ticket}) { - const guild = client.guilds.cache.get(config.guild); - const id = args[0]; - - let ticket = await Ticket.findOne({ - where: { - id: id, - open: false - } - }); - - - if (!ticket) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Unknown ticket**') - .setDescription('Couldn\'t find a closed ticket with that ID') - .setFooter(guild.name, guild.iconURL()) - ); - } - - if (message.author.id !== ticket.creator && !message.member.roles.cache.has(config.staff_role)) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription(`You don't have permission to view ticket ${id} as it does not belong to you and you are not staff.`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - let res = {}; - const embed = new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle(`Ticket ${id}`) - .setFooter(guild.name, guild.iconURL()); - - let file = `../../user/transcripts/text/${ticket.channel}.txt`; - if (fs.existsSync(join(__dirname, file))) { - embed.addField('Text transcript', 'See attachment'); - res.files = [ - { - attachment: join(__dirname, file), - name: `ticket-${id}-${ticket.channel}.txt` - } - ]; - } - - - const BASE_URL = config.transcripts.web.server; - if (config.transcripts.web.enabled) embed.addField('Web archive', `${BASE_URL}/${ticket.creator}/${ticket.channel}`); - - if (embed.fields.length < 1) embed.setDescription(`No text transcripts or archive data exists for ticket ${id}`); - - res.embed = embed; - - let channel; - try { - channel = message.author.dmChannel || await message.author.createDM(); - } catch (e) { - channel = message.channel; - } - - channel.send(res).then(m => { - if (channel.id === message.channel.id) m.delete({timeout: 15000}); - }); - message.delete({timeout: 1500}); - } -}; \ No newline at end of file diff --git a/src/commands/transfer.js b/src/commands/transfer.js deleted file mode 100644 index 9c9ef46..0000000 --- a/src/commands/transfer.js +++ /dev/null @@ -1,87 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); - -module.exports = { - name: 'transfer', - description: 'Transfer ownership of a ticket channel', - usage: '<@member>', - aliases: ['none'], - example: 'transfer @user', - args: true, - async execute(client, message, args, { config, Ticket }) { - const guild = client.guilds.cache.get(config.guild); - - let ticket = await Ticket.findOne({ - where: { - channel: message.channel.id - } - }); - - if (!ticket) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **This isn\'t a ticket channel**') - .setDescription('Use this command in the ticket channel you want to change owner.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - if (!message.member.roles.cache.has(config.staff_role)) - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **No permission**') - .setDescription('You don\'t have permission to change ownership of this channel as you are not staff.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - - let member = guild.member(message.mentions.users.first() || guild.members.cache.get(args[0])); - - if (!member) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('❌ **Unknown member**') - .setDescription('Please mention a valid member.') - .addField('Usage', `\`${config.prefix}${this.name} ${this.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${this.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - - message.channel.setTopic(`${member} | ${ticket.topic}`); - - Ticket.update({ - creator: member.user.id - }, { - where: { - channel: message.channel.id - } - }); - - message.channel.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(message.author.username, message.author.displayAvatarURL()) - .setTitle('✅ **Ticket transferred**') - .setDescription(`Ownership of this ticket has been transferred to ${member}.`) - .setFooter(client.user.username, client.user.displayAvatarURL()) - ); - } -}; diff --git a/src/events/debug.js b/src/events/debug.js deleted file mode 100644 index 04bb2b6..0000000 --- a/src/events/debug.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -module.exports = { - event: 'debug', - execute(_client, log, [e]) { - log.debug(e); - } -}; \ No newline at end of file diff --git a/src/events/error.js b/src/events/error.js deleted file mode 100644 index 53f68f6..0000000 --- a/src/events/error.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -module.exports = { - event: 'error', - execute(_client, log, [e]) { - log.error(e); - } -}; \ No newline at end of file diff --git a/src/events/message.js b/src/events/message.js deleted file mode 100644 index 8d5dbfd..0000000 --- a/src/events/message.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { Collection, MessageEmbed } = require('discord.js'); -const archive = require('../modules/archive'); - -module.exports = { - event: 'message', - async execute(client, log, [message], {config, Ticket, Setting}) { - - const guild = client.guilds.cache.get(config.guild); - - if (message.channel.type === 'dm' && !message.author.bot) { - log.console(`Received a DM from ${message.author.tag}: ${message.cleanContent}`); - return message.channel.send(`Hello there, ${message.author.username}! -I am the support bot for **${guild}**. -Type \`${config.prefix}new\` on the server to create a new ticket.`); - } // stop here if is DM - - /** - * Ticket transcripts - * (bots currently still allowed) - */ - - let ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if (ticket) { - archive.add(message); // add message to archive - // Update the ticket updated at so closeall can get most recent - ticket.changed('updatedAt', true); - ticket.save(); - } - - if (message.author.bot || message.author.id === client.user.id) return; // goodbye bots - - - /** - * Command handler - * (no bots / self) - */ - - const regex = new RegExp(`^(<@!?${client.user.id}>|\\${config.prefix.toLowerCase()})\\s*`); - if (!regex.test(message.content.toLowerCase())) return; // not a command - - const [, prefix] = message.content.toLowerCase().match(regex); - const args = message.content.slice(prefix.length).trim().split(/ +/); - const commandName = args.shift().toLowerCase(); - const command = client.commands.get(commandName) - || client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName)); - - if (!command || commandName === 'none') return; // not an existing command - - if (message.guild.id !== guild.id) return message.reply(`This bot can only be used within the "${guild}" server`); // not in this server - - if (command.permission && !message.member.hasPermission(command.permission)) { - log.console(`${message.author.tag} tried to use the '${command.name}' command without permission`); - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setTitle('❌ No permission') - .setDescription(`**You do not have permission to use the \`${command.name}\` command** (requires \`${command.permission}\`).`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - if (command.args && !args.length) { - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .addField('Usage', `\`${config.prefix}${command.name} ${command.usage}\`\n`) - .addField('Help', `Type \`${config.prefix}help ${command.name}\` for more information`) - .setFooter(guild.name, guild.iconURL()) - ); - } - - if (!client.cooldowns.has(command.name)) client.cooldowns.set(command.name, new Collection()); - - const now = Date.now(); - const timestamps = client.cooldowns.get(command.name); - const cooldownAmount = (command.cooldown || config.cooldown) * 1000; - - if (timestamps.has(message.author.id)) { - const expirationTime = timestamps.get(message.author.id) + cooldownAmount; - - if (now < expirationTime) { - const timeLeft = (expirationTime - now) / 1000; - log.console(`${message.author.tag} attempted to use the '${command.name}' command before the cooldown was over`); - return message.channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setDescription(`❌ Please wait ${timeLeft.toFixed(1)} second(s) before reusing the \`${command.name}\` command.`) - .setFooter(guild.name, guild.iconURL()) - ); - } - } - - timestamps.set(message.author.id, now); - setTimeout(() => timestamps.delete(message.author.id), cooldownAmount); - - try { - command.execute(client, message, args, log, {config, Ticket, Setting}); - log.console(`${message.author.tag} used the '${command.name}' command`); - } catch (error) { - log.warn(`An error occurred whilst executing the '${command.name}' command`); - log.error(error); - message.channel.send(`❌ An error occurred whilst executing the \`${command.name}\` command.`); - } - } -}; diff --git a/src/events/messageDelete.js b/src/events/messageDelete.js deleted file mode 100644 index 1e35e63..0000000 --- a/src/events/messageDelete.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const fs = require('fs'); -const { join } = require('path'); - -module.exports = { - event: 'messageDelete', - async execute(_client, log, [message], {config, Ticket}) { - if (!config.transcripts.web.enabled) return; - - if (message.partial) { - try { - await message.fetch(); - } catch (err) { - log.warn('Failed to fetch deleted message'); - log.error(err.message); - return; - } - } - - let ticket = await Ticket.findOne({ where: { channel: message.channel.id } }); - if (!ticket) return; - - - let path = `../../user/transcripts/raw/${message.channel.id}.log`; - let embeds = []; - for (let embed in message.embeds) embeds.push(message.embeds[embed].toJSON()); - - fs.appendFileSync(join(__dirname, path), JSON.stringify({ - id: message.id, - author: message.author.id, - content: message.content, // do not use cleanContent! - time: message.createdTimestamp, - embeds: embeds, - attachments: [...message.attachments.values()], - edited: message.edits.length > 1, - deleted: true // delete the message - }) + '\n'); - } -}; \ No newline at end of file diff --git a/src/events/messageReactionAdd.js b/src/events/messageReactionAdd.js deleted file mode 100644 index d69c961..0000000 --- a/src/events/messageReactionAdd.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { MessageEmbed } = require('discord.js'); -const fs = require('fs'); -const { join } = require('path'); - -module.exports = { - event: 'messageReactionAdd', - async execute(client, log, [r, u], {config, Ticket, Setting}) { - if (r.partial) { - try { - await r.fetch(); - } catch (err) { - log.error(err); - return; - } - } - - let panelID = await Setting.findOne({ where: { key: 'panel_msg_id' } }); - if (!panelID) return; - - if (r.message.id !== panelID.get('value')) return; - - if (u.id === client.user.id) return; - - if (r.emoji.name !== config.panel.reaction && r.emoji.id !== config.panel.reaction) return; - - let channel = r.message.channel; - - const supportRole = channel.guild.roles.cache.get(config.staff_role); - if (!supportRole) { - return channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setTitle('❌ **Error**') - .setDescription(`${config.name} has not been set up correctly. Could not find a 'support team' role with the id \`${config.staff_role}\``) - .setFooter(channel.guild.name, channel.guild.iconURL()) - ); - } - - // everything is cool - - await r.users.remove(u.id); // effectively cancel reaction - - let tickets = await Ticket.findAndCountAll({ - where: { - creator: u.id, - open: true - }, - limit: config.tickets.max - }); - - if (tickets.count >= config.tickets.max) { - let ticketList = []; - for (let t in tickets.rows) { - let desc = tickets.rows[t].topic.substring(0, 30); - ticketList - .push(`<#${tickets.rows[t].channel}>: \`${desc}${desc.length > 30 ? '...' : ''}\``); - } - let dm = u.dmChannel || await u.createDM(); - - try { - return dm.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(u.username, u.displayAvatarURL()) - .setTitle(`❌ **You already have ${tickets.count} or more open tickets**`) - .setDescription(`Use \`${config.prefix}close\` in a server channel to close unneeded tickets.\n\n${ticketList.join(',\n')}`) - .setFooter(channel.guild.name, channel.guild.iconURL()) - ); - } catch (e) { - let m = await channel.send( - new MessageEmbed() - .setColor(config.err_colour) - .setAuthor(u.username, u.displayAvatarURL()) - .setTitle(`❌ **You already have ${tickets.count} or more open tickets**`) - .setDescription(`Use \`${config.prefix}close\` to close unneeded tickets.\n\n${ticketList.join(',\n')}`) - .setFooter(channel.guild.name + ' | This message will be deleted in 15 seconds', channel.guild.iconURL()) - ); - return m.delete({ timeout: 15000 }); - } - } - - let topic = config.tickets.default_topic.command; - - let ticket = await Ticket.create({ - channel: '', - creator: u.id, - open: true, - archived: false, - topic: topic - }); - - let name = 'ticket-' + ticket.id; - - channel.guild.channels.create(name, { - type: 'text', - topic: `${u} | ${topic}`, - parent: config.tickets.category, - permissionOverwrites: [{ - id: channel.guild.roles.everyone, - deny: ['VIEW_CHANNEL', 'SEND_MESSAGES'] - }, - { - id: client.user, - allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - }, - { - id: channel.guild.member(u), - allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - }, - { - id: supportRole, - allow: ['VIEW_CHANNEL', 'SEND_MESSAGES', 'ATTACH_FILES', 'READ_MESSAGE_HISTORY'] - } - ], - reason: 'User requested a new support ticket channel (panel reaction)' - }).then(async c => { - Ticket.update({ - channel: c.id - }, { - where: { - id: ticket.id - } - }); - - // require('../modules/archive').create(client, c); // create files - - let ping; - switch (config.tickets.ping) { - case 'staff': - ping = `<@&${config.staff_role}>,\n`; - break; - case false: - ping = ''; - break; - default: - ping = `@${config.tickets.ping},\n`; - } - - await c.send(ping + `${u} has created a new ticket`); - - if (config.tickets.send_img) { - const images = fs.readdirSync(join(__dirname, '../../user/images')); - await c.send({ - files: [ - join(__dirname, '../../user/images', images[Math.floor(Math.random() * images.length)]) - ] - }); - } - - let text = config.tickets.text - .replace(/{{ ?name ?}}/gmi, u.username) - .replace(/{{ ?(tag|mention) ?}}/gmi, u); - - - let w = await c.send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(u.username, u.displayAvatarURL()) - .setDescription(text) - .addField('Topic', `\`${topic}\``) - .setFooter(channel.guild.name, channel.guild.iconURL()) - ); - - if (config.tickets.pin) await w.pin(); - // await w.pin().then(m => m.delete()); // oopsie, this deletes the pinned message - - if (config.logs.discord.enabled) - client.channels.cache.get(config.logs.discord.channel).send( - new MessageEmbed() - .setColor(config.colour) - .setAuthor(u.username, u.displayAvatarURL()) - .setTitle('New ticket (via panel)') - .setDescription(`\`${topic}\``) - .addField('Creator', u, true) - .addField('Channel', c, true) - .setFooter(channel.guild.name, channel.guild.iconURL()) - .setTimestamp() - ); - - log.info(`${u.tag} created a new ticket (#${name}) via panel`); - }).catch(log.error); - } -}; diff --git a/src/events/messageUpdate.js b/src/events/messageUpdate.js deleted file mode 100644 index 5ec7d4a..0000000 --- a/src/events/messageUpdate.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const fs = require('fs'); -const { join } = require('path'); - -module.exports = { - event: 'messageUpdate', - async execute(_client, log, [o, n], {config, Ticket}) { - if (!config.transcripts.web.enabled) return; - - if (o.partial) { - try { - await o.fetch(); - } catch (err) { - log.error(err); - return; - } - } - - if (n.partial) { - try { - await n.fetch(); - } catch (err) { - log.error(err); - return; - } - } - - let ticket = await Ticket.findOne({ where: { channel: n.channel.id } }); - if (!ticket) return; - - let path = `../../user/transcripts/raw/${n.channel.id}.log`; - let embeds = []; - for (let embed in n.embeds) embeds.push({ ...n.embeds[embed] }); - - fs.appendFileSync(join(__dirname, path), JSON.stringify({ - id: n.id, - author: n.author.id, - content: n.content, // do not use cleanContent! - time: n.createdTimestamp, - embeds: embeds, - attachments: [...n.attachments.values()], - edited: true - }) + '\n'); - - } -}; \ No newline at end of file diff --git a/src/events/rateLimit.js b/src/events/rateLimit.js deleted file mode 100644 index 4ef9107..0000000 --- a/src/events/rateLimit.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -module.exports = { - event: 'rateLimit', - execute(_client, log, [limit]) { - log.warn('Rate-limited! (Enable debug mode in config for details)'); - log.debug(limit); - } -}; \ No newline at end of file diff --git a/src/events/ready.js b/src/events/ready.js deleted file mode 100644 index d1afb17..0000000 --- a/src/events/ready.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const Logger = require('leekslazylogger'); -const log = new Logger(); -const config = require('../../user/' + require('../').config); - -module.exports = { - event: 'ready', - execute(client, log) { - log.success(`Authenticated as ${client.user.tag}`); - - const updatePresence = () => { - const presence = config.presences[Math.floor(Math.random() * config.presences.length)]; - let activity = presence.activity + config.append_presence; - activity = activity.replace(/%s/g, config.prefix); - client.user.setPresence({ - activity: { - name: activity, - type: presence.type.toUpperCase() - } - }).catch(log.error); - log.debug(`Updated presence: ${activity} ${presence.type}`); - }; - - updatePresence(); - setInterval(() => { - updatePresence(); - }, 60000); - - - if (client.guilds.cache.get(config.guild).member(client.user).hasPermission('ADMINISTRATOR', false)) { - log.success('\'ADMINISTRATOR\' permission has been granted'); - } else log.warn('Bot does not have \'ADMINISTRATOR\' permission'); - } -}; diff --git a/src/events/warn.js b/src/events/warn.js deleted file mode 100644 index e442402..0000000 --- a/src/events/warn.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -module.exports = { - event: 'warn', - execute(_client, log, [e]) { - log.warn(e); - } -}; \ No newline at end of file diff --git a/src/index.js b/src/index.js index 5bb5530..aecee1d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,174 +1,22 @@ /** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - * DiscordTickets Copyright (C) 2020 Isaac "eartharoid" Saunders - * This program comes with ABSOLUTELY NO WARRANTY. - * This is free software, and you are welcome to redistribute it - * under certain conditions. See the included LICENSE file for details. - * - */ + * DiscordTickets + * Copyright (C) 2021 Isaac Saunders -const version = Number(process.version.split('.')[0].replace('v', '')); -if (version < 12) return console.log('Please upgrade to Node v12 or higher'); + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. -const fs = require('fs'); -const { join } = require('path'); + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. -let dev = fs.existsSync(join(__dirname, '../user/dev.env')) && fs.existsSync(join(__dirname, '../user/dev.config.js')); + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . -require('dotenv').config({ path: join(__dirname, '../user/', dev ? 'dev.env' : '.env') }); - -module.exports.config = dev ? 'dev.config.js' : 'config.js'; -const config = require(join(__dirname, '../user/', module.exports.config)); - -const Discord = require('discord.js'); -const client = new Discord.Client({ - autoReconnect: true, - partials: ['MESSAGE', 'CHANNEL', 'REACTION'], -}); - -client.events = new Discord.Collection(); -client.commands = new Discord.Collection(); -client.cooldowns = new Discord.Collection(); - -const utils = require('./modules/utils'); -const leeks = require('leeks.js'); - -require('./modules/banner')(leeks); // big coloured text thing - -const Logger = require('leekslazylogger'); -const log = new Logger({ - name: config.name, - logToFile: config.logs.files.enabled, - maxAge: config.logs.files.keep_for, - debug: config.debug -}); - -require('./modules/updater')(); // check for updates - -/** - * storage - */ -const { Sequelize, Model, DataTypes } = require('sequelize'); - -let sequelize; - -switch (config.storage.type) { -case 'mysql': - log.info('Connecting to MySQL database...'); - sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { - dialect: 'mysql', - host: process.env.DB_HOST, - logging: log.debug - }); - break; -case 'mariadb': - log.info('Connecting to MariaDB database...'); - sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { - dialect: 'mariadb', - host: process.env.DB_HOST, - logging: log.debug - }); - break; -case 'postgre': - log.info('Connecting to PostgreSQL database...'); - sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { - dialect: 'postgres', - host: process.env.DB_HOST, - logging: log.debug - }); - break; -case 'microsoft': - log.info('Connecting to Microsoft SQL Server database...'); - sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, { - dialect: 'mssql', - host: process.env.DB_HOST, - logging: log.debug - }); - break; -default: - log.info('Using SQLite storage'); - sequelize = new Sequelize({ - dialect: 'sqlite', - storage: join(__dirname, '../user/storage.db'), - logging: log.debug - }); -} - -class Ticket extends Model {} -Ticket.init({ - channel: DataTypes.STRING, - creator: DataTypes.STRING, - open: DataTypes.BOOLEAN, - topic: DataTypes.TEXT -}, { - sequelize, - modelName: 'ticket' -}); - -class Setting extends Model {} -Setting.init({ - key: DataTypes.STRING, - value: DataTypes.STRING, -}, { - sequelize, - modelName: 'setting' -}); - -Ticket.sync(); -Setting.sync(); - -/** - * event loader - */ -const events = fs.readdirSync(join(__dirname, 'events')).filter(file => file.endsWith('.js')); -for (const file of events) { - const event = require(`./events/${file}`); - client.events.set(event.event, event); - // client.on(event.event, e => client.events.get(event.event).execute(client, e, Ticket, Setting)); - client.on(event.event, (e1, e2) => client.events.get(event.event).execute(client, log, [e1, e2], {config, Ticket, Setting})); - log.console(log.format(`> Loaded &7${event.event}&f event`)); -} - -/** - * command loader - */ -const commands = fs.readdirSync(join(__dirname, 'commands')).filter(file => file.endsWith('.js')); -for (const file of commands) { - const command = require(`./commands/${file}`); - client.commands.set(command.name, command); - log.console(log.format(`> Loaded &7${config.prefix}${command.name}&f command`)); -} - -log.info(`Loaded ${events.length} events and ${commands.length} commands`); - -const one_day = 1000 * 60 * 60 * 24; -const txt = '../user/transcripts/text'; -const clean = () => { - const files = fs.readdirSync(join(__dirname, txt)).filter(file => file.endsWith('.txt')); - let total = 0; - for (const file of files) { - let diff = (new Date() - new Date(fs.statSync(join(__dirname, txt, file)).mtime)); - if (Math.floor(diff / one_day) > config.transcripts.text.keep_for) { - fs.unlinkSync(join(__dirname, txt, file)); - total++; - } - } - if (total > 0) log.info(`Deleted ${total} old text ${utils.plural('transcript', total)}`); -}; - -if (config.transcripts.text.enabled) { - clean(); - setInterval(clean, one_day); -} - -process.on('unhandledRejection', error => { - log.warn('An error was not caught'); - log.warn(`Uncaught ${error.name}: ${error.message}`); - log.error(error); -}); - -client.login(process.env.TOKEN); + * @name @eartharoid/discordtickets + * @description An open-source & self-hosted Discord bot for ticket management. + * @copyright 2021 Isaac Saunders + * @license GNU-GPLv3 + */ \ No newline at end of file diff --git a/src/modules/archive.js b/src/modules/archive.js deleted file mode 100644 index 6b11fd7..0000000 --- a/src/modules/archive.js +++ /dev/null @@ -1,161 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - - -const Logger = require('leekslazylogger'); -const log = new Logger(); -const Readlines = require('n-readlines'); -const fs = require('fs'); -const { join } = require('path'); -const dtf = require('@eartharoid/dtf'); -const config = require('../../user/' + require('../').config); -const fetch = require('node-fetch'); - -module.exports.add = (message) => { - - if (message.type !== 'DEFAULT') return; - - if (config.transcripts.text.enabled) { // text transcripts - let path = `../../user/transcripts/text/${message.channel.id}.txt`, - time = dtf('HH:mm:ss n_D MMM YY', message.createdAt), - msg = message.cleanContent; - message.attachments.each(a => msg += '\n' + a.url); - let string = `[${time}] [${message.author.tag}] :> ${msg}`; - fs.appendFileSync(join(__dirname, path), string + '\n'); - } - - if (config.transcripts.web.enabled) { // web archives - let raw = `../../user/transcripts/raw/${message.channel.id}.log`, - json = `../../user/transcripts/raw/entities/${message.channel.id}.json`; - - let embeds = []; - for (let embed in message.embeds) embeds.push({ ...message.embeds[embed] }); - - // message - fs.appendFileSync(join(__dirname, raw), JSON.stringify({ - id: message.id, - author: message.author.id, - content: message.content, // do not use cleanContent, we want to include the mentions! - time: message.createdTimestamp, - embeds: embeds, - attachments: [...message.attachments.values()] - }) + '\n'); - - // channel entities - if (!fs.existsSync(join(__dirname, json))) - fs.writeFileSync(join(__dirname, json), JSON.stringify({ - entities: { - users: {}, - channels: {}, - roles: {} - } - })); // create new - - let data = JSON.parse(fs.readFileSync(join(__dirname, json))); - - // if (!data.entities.users[message.author.id]) - data.entities.users[message.author.id] = { - avatar: message.author.displayAvatarURL(), - username: message.author.username, - discriminator: message.author.discriminator, - displayName: message.member.displayName, - color: message.member.displayColor === 0 ? null : message.member.displayColor, - badge: message.author.bot ? 'bot' : null - }; - - // mentions.users - message.mentions.members.each(m => data.entities.users[m.id] = { // for mentions - avatar: m.user.displayAvatarURL(), - username: m.user.username, - discriminator: m.user.discriminator, - displayName: m.user.displayName || m.user.username, - color: m.displayColor === 0 ? null : m.displayColor, - badge: m.user.bot ? 'bot' : null - }); - - message.mentions.channels.each(c => data.entities.channels[c.id] = { // for mentions only - name: c.name - }); - - message.mentions.roles.each(r => data.entities.roles[r.id] = { // for mentions only - name: r.name, - color: r.color === 0 ? 7506394 : r.color - }); - - fs.writeFileSync(join(__dirname, json), JSON.stringify(data)); - - } -}; - -module.exports.export = (Ticket, channel) => new Promise((resolve, reject) => { - - (async () => { - let ticket = await Ticket.findOne({ - where: { - channel: channel.id - } - }); - - let raw = `../../user/transcripts/raw/${channel.id}.log`, - json = `../../user/transcripts/raw/entities/${channel.id}.json`; - - if (!config.transcripts.web.enabled || !fs.existsSync(join(__dirname, raw)) || !fs.existsSync(join(__dirname, json))) return reject(false); - - let data = JSON.parse(fs.readFileSync(join(__dirname, json))); - - data.ticket = { - id: ticket.id, - name: channel.name, - creator: ticket.creator, - channel: channel.id, - topic: channel.topic - }; - - data.messages = []; - let line; - - const lineByLine = new Readlines(join(__dirname, raw)); - - // eslint-disable-next-line no-cond-assign - while (line = lineByLine.next()) { - let message = JSON.parse(line.toString('utf8')); - let index = data.messages.findIndex(m => m.id === message.id); - if (index === -1) data.messages.push(message); - else data.messages[index] = message; - } - - let endpoint = config.transcripts.web.server; - - if (endpoint[endpoint.length - 1] === '/') endpoint = endpoint.slice(0, -1); - - endpoint += `/${data.ticket.creator}/${data.ticket.channel}/?key=${process.env.ARCHIVES_KEY}`; - - fetch(encodeURI(endpoint), { - method: 'post', - body: JSON.stringify(data), - headers: { 'Content-Type': 'application/json' }, - }) - .then(res => res.json()) - .then(res => { - if (res.status !== 200) { - log.warn(res); - return resolve(new Error(`${res.status} (${res.message})`)); - } - - log.success(`Uploaded ticket #${ticket.id} archive to server`); - - fs.unlinkSync(join(__dirname, raw)); - fs.unlinkSync(join(__dirname, json)); - - resolve(res.url); - }).catch(e => { - log.warn(e); - return resolve(e); - }); - })(); -}); diff --git a/src/modules/banner.js b/src/modules/banner.js deleted file mode 100644 index e686532..0000000 --- a/src/modules/banner.js +++ /dev/null @@ -1,34 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const { version, homepage } = require('../../package.json'); -const link = require('terminal-link'); - -module.exports = (leeks) => { - console.log(leeks.colours.cyan(` -######## #### ###### ###### ####### ######## ######## -## ## ## ## ## ## ## ## ## ## ## ## ## -## ## ## ## ## ## ## ## ## ## ## -## ## ## ###### ## ## ## ######## ## ## -## ## ## ## ## ## ## ## ## ## ## -## ## ## ## ## ## ## ## ## ## ## ## ## -######## #### ###### ###### ####### ## ## ######## - -######## #### ###### ## ## ######## ######## ###### - ## ## ## ## ## ## ## ## ## ## - ## ## ## ## ## ## ## ## - ## ## ## ##### ###### ## ###### - ## ## ## ## ## ## ## ## - ## ## ## ## ## ## ## ## ## ## - ## #### ###### ## ## ######## ## ###### -`)); - console.log(leeks.colours.cyanBright(`DiscordTickets bot v${version} by eartharoid`)); - console.log(leeks.colours.cyanBright(homepage + '\n')); - console.log(leeks.colours.cyanBright(`Please ${link('donate', 'https://ko-fi.com/eartharoid')} if you find this bot useful`)); - console.log('\n\n'); -}; \ No newline at end of file diff --git a/src/modules/updater.js b/src/modules/updater.js deleted file mode 100644 index ce472c8..0000000 --- a/src/modules/updater.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -const Logger = require('leekslazylogger'); -const log = new Logger(); -const fetch = require('node-fetch'); -const config = require('../../user/' + require('../').config); -let {version} = require('../../package.json'); -version = 'v' + version; -const boxen = require('boxen'); -const link = require('terminal-link'); - -module.exports = async () => { - if (!config.updater) return; - const json = await (await fetch('https://api.github.com/repos/eartharoid/DiscordTickets/releases')).json(); - const update = json[0]; - let notice = []; - - if (version !== update.tag_name) { - log.notice(log.f(`There is an update available for Discord Tickets (${version} -> ${update.tag_name})`)); - - notice.push(`&6You are currently using &c${version}&6, the latest is &a${update.tag_name}&6.`); - notice.push(`&6Download "&f${update.name}&6" from`); - notice.push(link('&6the GitHub releases page', 'https://github.com/eartharoid/DiscordTickets/releases/')); - - console.log( - boxen(log.f(notice.join('\n')), { - padding: 1, - margin: 1, - align: 'center', - borderColor: 'yellow', - borderStyle: 'round' - }) - ); - } -}; \ No newline at end of file diff --git a/src/modules/utils.js b/src/modules/utils.js deleted file mode 100644 index 3eeecc1..0000000 --- a/src/modules/utils.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - * @name DiscordTickets - * @author eartharoid - * @license GNU-GPLv3 - * - */ - -module.exports = { - /** - * @description Appends 's' to a word if plural number - * @param {string} word - singular version of word - * @param {number} num - integer - */ - plural(word, num) { - return num !== 1 ? word + 's' : word; - } -}; \ No newline at end of file diff --git a/user/.env b/user/.env deleted file mode 100644 index f8e4b3c..0000000 --- a/user/.env +++ /dev/null @@ -1,8 +0,0 @@ -TOKEN= - -ARCHIVES_KEY= - -DB_HOST= -DB_NAME= -DB_USER= -DB_PASS= \ No newline at end of file diff --git a/user/config.js b/user/config.js index e5083ab..5e670c6 100644 --- a/user/config.js +++ b/user/config.js @@ -10,110 +10,48 @@ * Quick Start * --------------------- * - * > For detailed instructions, visit the GitHub repository and read the documentation: - * https://github.com/eartharoid/DiscordTickets/wiki - * - * > IMPORTANT: Also edit the TOKEN in 'user/.env' + * > For detailed instructions, visit the documentation: https://eartharoid.github.io/discordtickets * * --------------------- * Support * --------------------- * - * > Information: https://github.com/eartharoid/DiscordTickets/#readme - * > Discord Support Server: https://go.eartharoid.me/discord - * > Wiki: https://github.com/eartharoid/DiscordTickets/wiki + * > Discord support server: https://go.eartharoid.me/discord + * > Wiki: https://eartharoid.github.io/discordtickets * * ############################################################################################### */ module.exports = { - prefix: '-', - name: 'DiscordTickets', - presences: [ - { - activity: '%snew', - type: 'PLAYING' - }, - { - activity: 'with tickets', - type: 'PLAYING' - }, - { - activity: 'for new tickets', - type: 'WATCHING' - } - ], - append_presence: ' | %shelp', - colour: '#009999', - err_colour: 'RED', - cooldown: 3, - guild: '', // ID of your guild (REQUIRED) - staff_role: '', // ID of your Support Team role (REQUIRED) - - tickets: { - category: '', // ID of your tickets category (REQUIRED) - send_img: true, - ping: 'here', - text: `Hello there, {{ tag }}! - A member of staff will assist you shortly. - In the mean time, please describe your issue in as much detail as possible! :)`, - pin: false, - max: 3, - default_topic: { - command: 'No topic given', - panel: 'Created via panel' - } - }, - - commands: { - close: { - confirmation: true, - send_transcripts: true - }, - delete: { - confirmation: true - }, - new: { - enabled: true - }, - closeall: { - enabled: true, - }, - }, - - transcripts: { - text: { - enabled: true, - keep_for: 90, - }, - web: { - enabled: false, - server: 'https://tickets.example.com', - }, - channel: '' // ID of your archives channel - }, - - panel: { - title: 'Support Tickets', - description: 'Need help? No problem! React to this panel to create a new support ticket so our Support Team can assist you.', - reaction: '🧾' - }, - storage: { type: 'sqlite' }, - - logs: { - files: { - enabled: true, - keep_for: 7 - }, - discord: { - enabled: false, - channel: '' // ID of your log channel - } + portal: { + enabled: true, + host: 'https://tickets.eartharoid.me' + }, + presences: [ + { + activity: '%snew | %shelp', + type: 'PLAYING' + }, + { + activity: 'with tickets | %shelp', + type: 'PLAYING' + }, + { + activity: 'for new tickets | %shelp', + type: 'WATCHING' + } + ], + defaults: { + prefix: '-', + colour: '#009999', + }, + logs: { + enabled: true, + keep_for: 30 }, - debug: false, - updater: true -}; + update_notice: true, +}; \ No newline at end of file diff --git a/user/example.config.js b/user/example.config.js new file mode 100644 index 0000000..8c58b28 --- /dev/null +++ b/user/example.config.js @@ -0,0 +1,57 @@ +/** + * ############################################################################################### + * ____ _ _____ _ _ + * | _ \ (_) ___ ___ ___ _ __ __| | |_ _| (_) ___ | | __ ___ | |_ ___ + * | | | | | | / __| / __| / _ \ | '__| / _` | | | | | / __| | |/ / / _ \ | __| / __| + * | |_| | | | \__ \ | (__ | (_) | | | | (_| | | | | | | (__ | < | __/ | |_ \__ \ + * |____/ |_| |___/ \___| \___/ |_| \__,_| |_| |_| \___| |_|\_\ \___| \__| |___/ + * + * --------------------- + * Quick Start + * --------------------- + * + * > For detailed instructions, visit the documentation: https://eartharoid.github.io/discordtickets + * + * --------------------- + * Support + * --------------------- + * + * > Discord support server: https://go.eartharoid.me/discord + * > Wiki: https://eartharoid.github.io/discordtickets + * + * ############################################################################################### + */ + +module.exports = { + storage: { + type: 'sqlite' + }, + portal: { + enabled: false, + host: 'https://tickets.example.com' + }, + presences: [ + { + activity: '%snew | %shelp', + type: 'PLAYING' + }, + { + activity: 'with tickets | %shelp', + type: 'PLAYING' + }, + { + activity: 'for new tickets | %shelp', + type: 'WATCHING' + } + ], + defaults: { + prefix: '-', + colour: '#009999', + }, + logs: { + enabled: true, + keep_for: 30 + }, + debug: false, + update_notice: true, +}; \ No newline at end of file diff --git a/user/images/how-can-i-help-1.gif b/user/images/how-can-i-help-1.gif deleted file mode 100644 index 185fde1..0000000 Binary files a/user/images/how-can-i-help-1.gif and /dev/null differ diff --git a/user/images/how-can-i-help-2.gif b/user/images/how-can-i-help-2.gif deleted file mode 100644 index 181a57e..0000000 Binary files a/user/images/how-can-i-help-2.gif and /dev/null differ diff --git a/user/images/how-can-we-help.gif b/user/images/how-can-we-help.gif deleted file mode 100644 index b57bd7d..0000000 Binary files a/user/images/how-can-we-help.gif and /dev/null differ diff --git a/user/transcripts/raw/entities/.gitkeep b/user/transcripts/raw/entities/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/user/transcripts/text/.gitkeep b/user/transcripts/text/.gitkeep deleted file mode 100644 index e69de29..0000000